我写了这个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由于某些原因,它只是在文件中写入变量dex,而不是数字+1。
发布于 2021-12-29 00:44:15
正如其他人所说的,您可以通过对文件名使用更简单的变量名来避免这种情况,比如counter=$(cat "bv$(date +%Y%m%d)")。
但是,如果你想了解为什么它不能工作,问题是这一行:
echo $bv$dex > ./bv$dex.txt命令echo $bv$dex将$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之后。
发布于 2021-12-28 23:00:01
从给定的代码来看,一旦日期已知,文件名似乎是不变的。
让变量名与文件的基本名称匹配是没有好处的。
#.. 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 ))https://unix.stackexchange.com/questions/684172
复制相似问题