파일을 덮어쓰고 표준 출력으로 에코합니다.

파일을 덮어쓰고 표준 출력으로 에코합니다.

숫자를 증가시켜 파일에 저장하는 간단한 bash 함수가 있습니다.

get_next_int (){
   my_file="$HOME/next_int.json"
   touch "$my_file"
   typeset -i my_num=$(cat "$my_file")
   echo "$((++my_num))" > "$my_file" | tee
}

이 라인에 관해서 :

echo "$((++my_num))" > "$my_file" | tee

궁금해서, 증가하는 정수로 파일을 덮어쓰고 이를 stdout에 에코하는 방법이 있습니까?

티셔츠에 대한 이 답변은 내 상황을 다루지 않는 것 같습니다.

출력을 파일 및 stdout으로 리디렉션하는 방법 스택 오버플로 |

또한, 이 줄에 대해서는 다음과 같습니다.

typeset -i my_num=$(cat "$my_file")

파일에서 문자열의 정수 표현을 가져옵니다. 그러나 파일이 비어 있으면 기본값은 1로 설정해야 합니다.

다음과 같은 방법이 있습니까?

typeset -i my_num=$(cat "$my_file" | default "1")

답변1

echo "$(( ++my_num ))" | tee "$my_file"

기본적으로 Tee는 명명된 파일을 표준 출력에 씁니다.

나중에 typeset -i my_num=$(cat "$my_file")(아마도 typeset -i my_num=$(<"$my_file")이후 bash) 사용할 수 있습니다

my_num=$(( my_num == 0 ? 1 : my_num ))

값이 0이면 1로 설정합니다. 비어 있으면 정수 변수는 bash0으로 평가됩니다.

예전에는제안하겠지만 my_num=${my_num:-1}, 정수 변수이기 때문에 my_num비어 있으면 빈 문자열이 아닌 0으로 확장됩니다. 이는 매개변수 ${variable:-value}대체가 작동하지 않음을 의미합니다(그렇지 않으면 value변수가 설정되지 않거나 비어 있으면 확장됩니다. 비어 있음).


이 함수를 다음과 같이 쓸 수도 있습니다.

get_next_int () {
    local -i val
    read val <"$HOME/next_int.json"
    val=$(( val == 0 ? 1 : val ))
    printf "%d\n" "$(( val + 1 ))" | tee "$HOME/next_int.json"
}

"$HOME/next_int.json"항상 단일 정수를 포함한다고 가정합니다 . touch파일 수정 타임스탬프가 업데이트되므로 생략합니다 tee( touch액세스 타임스탬프도 업데이트해야 하는 경우 그대로 둡니다).

관련 정보