숫자를 증가시켜 파일에 저장하는 간단한 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로 설정합니다. 비어 있으면 정수 변수는 bash
0으로 평가됩니다.
나예전에는제안하겠지만 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
액세스 타임스탬프도 업데이트해야 하는 경우 그대로 둡니다).