Bash脚本以编程方式更新文件
我有一个这样的文件Bash脚本以编程方式更新文件,bash,terminal,Bash,Terminal,我有一个这样的文件 adv_dir=2 ami_pro=3 我有一个变量$TEMP,其值为ami_pro,我想将$TEMP的值增加1 想要一个bash脚本。 更新后的文件状态 adv_dir=2 ami_pro=4 您可以使用awk进行以下操作: #!/bin/bash TMP_FILE=$(mktemp) awk -F= "/^${TEMP}=/ {print \$1 \"=\" \$2 + 1 \"*\"
adv_dir=2
ami_pro=3
我有一个变量$TEMP
,其值为ami_pro
,我想将$TEMP
的值增加1
想要一个bash脚本。
更新后的文件状态
adv_dir=2
ami_pro=4
您可以使用
awk
进行以下操作:
#!/bin/bash
TMP_FILE=$(mktemp)
awk -F= "/^${TEMP}=/ {print \$1 \"=\" \$2 + 1 \"*\"; next} 1" "${1}" > ${TMP_FILE} && mv ${TMP_FILE} "${1}"
rm ${TMP_FILE}
将包含数据的文件作为参数传递到此脚本。古怪的间接寻址,但
$: echo $TEMP
ami_pro
$: echo $ami_pro
4
$: (($TEMP++)) # $TEMP evals to ami_pro, which gets incremented
$: echo $TEMP
ami_pro
$: echo $ami_pro
5
$: let $TEMP++ # same, likely in any arithmetic context
$: echo $ami_pro
6
所以
你可以用eval“$(grep“$TEMP=“file)”
跳过tempfile,但是eval
让我很痒
sed
是对文件
的就地编辑,使用双引号允许操作系统在进行更新之前预处理变量
TEMP=ami_pro
所以
被操作系统解析为
ami_pro=$ami_pro
因为我们得到了表示ami_pro=3的行,所以进一步解析为
ami_pro=3
然后
变成ami\u pro=$(++ami\u pro))
哪个进程
ami_pro=4
sedsed
得到的是结果字符串,所以当sedsed
开始解析时,它看到的是
s/ami_pro=3/ami_pro=4/
一旦编辑完成,我们就可以打破循环。您尝试了什么?你在哪里卡住了?我很高兴我投入了(少量)时间和精力来回答这个问题,只是为了让第三方能够在OP有机会接受答案之前关闭它。
$TEMP=$((++$TEMP))
ami_pro=4
s/ami_pro=3/ami_pro=4/