bash를 사용하여 파일의 내용 값에 1을 추가하는 방법은 무엇입니까?

bash를 사용하여 파일의 내용 값에 1을 추가하는 방법은 무엇입니까?

이 bash 스크립트를 작성했지만 작동하지 않습니다.

dex=`date +%Y%m%d`

if [ -f "bv$dex.txt" ]; 

then
eval bv$dex=`cat ./bv$dex.txt`
let bv$dex+=1 ;
echo $bv$dex > ./bv$dex.txt

else
echo 1 > ./bv$dex.txt

fi

어떤 이유로 파일에 숫자 + 1 대신 변수 dex를 씁니다.

답변1

다른 사람들이 말했듯이, 파일 이름에 더 간단한 변수 이름을 사용하면 이를 피할 수 있습니다 counter=$(cat "bv$(date +%Y%m%d)").

그러나 이것이 작동하지 않는 이유를 알고 싶다면 문제는 다음과 같습니다.

echo $bv$dex > ./bv$dex.txt

이 명령은 및 를 두 개의 별도 표현식으로 echo $bv$dex평가 한 다음 결과를 연결합니다. Note는 정의되지 않았으므로 (빈 문자열)*로 평가됩니다. 따라서 이는 날짜를 인쇄하는 것과 동일합니다 .$bv$dex$bv""echo $dex

대신에 당신은 원할 것입니다

eval echo \$bv$dex > ./bv$dex.txt

예를 들어 dex=20211228, 표현식은 변수 참조가 아닌 리터럴로 처리되므로 리터럴 \$bv$dex문자열로 평가됩니다 . 따라서 명령은 예상한 결과를 생성하는 이 됩니다 .$bv20211228\$$evalecho $bv20211228

가능하다고 해서 좋은 생각은 아닙니다 :)

set -u* 스크립트 상단에 추가하면 빈 문자열로 평가하는 대신 평가 시 실패하게 됩니다. set -eushebang 다음에 스크립트의 첫 번째 줄로 추가하는 것이 좋습니다 #!/bin/bash.

답변2

제공된 코드에 따르면 날짜가 알려지면 파일 이름이 변경되지 않는 것 같습니다.

변수 이름이 파일의 기본 이름과 일치하면 이점이 없습니다.

#.. Create the full filename.
printf -v Fn 'bv%(%Y%m%d)T.txt' -1

#.. Create or fetch the serial number.
Num=0
[[ -r "${Fn}" ]] && read -r Num < "${Fn}"

#.. Write the incremented serial.
printf > "${Fn}" '%d\n' $(( ++Num ))

관련 정보