이 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
\$
$
eval
echo $bv20211228
가능하다고 해서 좋은 생각은 아닙니다 :)
set -u
* 스크립트 상단에 추가하면 빈 문자열로 평가하는 대신 평가 시 실패하게 됩니다. set -eu
shebang 다음에 스크립트의 첫 번째 줄로 추가하는 것이 좋습니다 #!/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 ))