如何使用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

由于某种原因,它只是在文件中写入变量 dex,而不是 number + 1

答案1

正如其他人所说,您可以通过使用更简单的变量名作为文件名来避免这种情况,例如counter=$(cat "bv$(date +%Y%m%d)").

但如果你想了解为什么它不起作用,问题就出在这一行:

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

该命令echo $bv$dex$bvand$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 ))

相关内容