我写了这个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,而不是 number + 1
答案1
正如其他人所说,您可以通过使用更简单的变量名作为文件名来避免这种情况,例如counter=$(cat "bv$(date +%Y%m%d)")
.
但如果你想了解为什么它不起作用,问题就出在这一行:
echo $bv$dex > ./bv$dex.txt
该命令echo $bv$dex
将$bv
and$dex
作为两个单独的表达式进行计算,然后连接结果。 Note$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 ))