我写了这个 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
我写了这个 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
从给出的代码来看,一旦知道日期,文件名似乎是不变的。
让变量名与文件的基名匹配没有任何好处。
正如其他人所说,您可以通过为文件名使用更简单的变量名来避免这种情况,例如
counter=$(cat "bv$(date +%Y%m%d)")
.但是,如果您想了解它为什么不起作用,那么问题就出在这一行:
该命令将和作为两个单独的表达式
echo $bv$dex
进行评估,并将结果连接起来。注意未定义,因此它的计算结果为(空字符串)*。所以这相当于只打印日期。$bv
$dex
$bv
""
echo $dex
相反,你会想要
如果
dex=20211228
(例如),则表达式的\$bv$dex
计算结果为文字 string$bv20211228
,因为\$
被视为文字$
而不是变量引用。所以这个eval
命令就变成echo $bv20211228
了,这会产生你期望的结果。仅仅因为这是可能的,并不意味着这是一个好主意:)
* 如果您添加
set -u
到脚本的顶部,它将在评估时失败,而不是评估为空字符串。我强烈建议set -eu
在 shebang 之后添加作为脚本的第一行#!/bin/bash
。