首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用bash 1增加文件的内容值?

如何使用bash 1增加文件的内容值?
EN

Unix & Linux用户
提问于 2021-12-28 14:31:11
回答 2查看 82关注 0票数 1

我写了这个bash脚本,但不起作用。

代码语言:javascript
运行
复制
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。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-12-29 00:44:15

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

但是,如果你想了解为什么它不能工作,问题是这一行:

代码语言:javascript
运行
复制
echo $bv$dex > ./bv$dex.txt

命令echo $bv$dex$bv$dex计算为两个单独的表达式,并将结果连接起来。注$bv未定义,因此它的计算结果为"" (空字符串) *。这相当于echo $dex,它只打印日期。

相反,你会想

代码语言:javascript
运行
复制
eval echo \$bv$dex > ./bv$dex.txt

如果是dex=20211228 (例如),则表达式\$bv$dex计算为文字字符串$bv20211228,因为\$被视为文本$而不是变量引用。这样,这个eval命令就变成了echo $bv20211228,它产生了您期望的结果。

虽然这是可能的,但这并不意味着这是一个好主意:)

*如果将set -u添加到脚本的顶部,它将在计算时失败,而不是对空字符串进行计算。我强烈建议添加set -eu作为脚本的第一行,就在shebang #!/bin/bash之后。

票数 1
EN

Unix & Linux用户

发布于 2021-12-28 23:00:01

从给定的代码来看,一旦日期已知,文件名似乎是不变的。

让变量名与文件的基本名称匹配是没有好处的。

代码语言:javascript
运行
复制
#.. 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 ))
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/684172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档