Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本以编程方式更新文件_Bash_Terminal - Fatal编程技术网

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
sed
sed
得到的是结果字符串,所以当sed
sed
开始解析时,它看到的是

s/ami_pro=3/ami_pro=4/ 

一旦编辑完成,我们就可以打破循环。

您尝试了什么?你在哪里卡住了?我很高兴我投入了(少量)时间和精力来回答这个问题,只是为了让第三方能够在OP有机会接受答案之前关闭它。
$TEMP=$((++$TEMP))
ami_pro=4
s/ami_pro=3/ami_pro=4/