用bash增加

Dᴀʀ*_*ᴅᴇʀ 20 bash shell increment

我试图增加.xml文件中的变量.标签可以在文件中100次或仅两次.我试图添加一个值,将增加数倍的数量.我已经包含了一些我正在处理的示例代码,但是当我运行脚本时,它只会放置一个而不会进一步增加.对于我做错的建议会很好.

for xmlfile in $(find $DIRECTORY -type f -name \*.xml); do
  TFILE="/tmp/$directoryname.$$"
  FROM='><process>'
  TO=' value\=""><process>'
  i=0
  while [ $i -lt 10 ]; do
    i=`expr $i + 1`
    FROM='value\=""'
    TO='value\="'$i'"'
  done
  sed "s/$FROM/$TO/g" "$xmlfile" > $TFILE && mv $TFILE "$xmlfile"
done
Run Code Online (Sandbox Code Playgroud)

while回路是我刚才放置测试代码.它会插入<process>但不会插入增量.

我的最终目标:

<process>value="1"</process>
<process>value="2"</process>
<process>value="3"</process>
<process>value="4"</process>
Run Code Online (Sandbox Code Playgroud)

只要<process>文件中存在它就需要递增.

sam*_*hen 32

我刚刚测试了你的代码,它似乎正确递增i.

您可以尝试更改增量语法:

i=`expr $i + 1`
Run Code Online (Sandbox Code Playgroud)

i=$((i+1))
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`((i ++))`.祝你们好运. (13认同)

Gil*_*not 20

要获得适当的增量bash,请使用for循环(C样式):

n=10
for ((i=1; i<=n; i++)) {
    printf '<process>value="%d"</process>\n' $i
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

<process>value="1"</process>
<process>value="2"</process>
<process>value="3"</process>
<process>value="4"</process>
<process>value="5"</process>
<process>value="6"</process>
<process>value="7"</process>
<process>value="8"</process>
<process>value="9"</process>
<process>value="10"</process>
Run Code Online (Sandbox Code Playgroud)

注意

expr是古代shell代码中用来做数学的程序.在像bash这样的Posix shell中,使用$((expression)).在bash和ksh93中,您也可以使用(( expression ))或者let expression如果您不需要在扩展中使用结果.

编辑

如果我误解了你的需求,你有一个空白值的文件,如下所示:

<process>value=""</process>
Run Code Online (Sandbox Code Playgroud)

试试这个 :

$ perl -i -pe '$c++; s/<process>value=""/<process>value"$c"/g' file.xml
<process>value"1"</process>
<process>value"2"</process>
<process>value"3"</process>
<process>value"4"</process>
<process>value"5"</process>
<process>value"6"</process>
<process>value"7"</process>
Run Code Online (Sandbox Code Playgroud)

-i 切换编辑文件为真实,所以要小心.


Cor*_*ein 11

这是在bash中增加变量的最简单方法:

i=0
((i++))
Run Code Online (Sandbox Code Playgroud)

  • 当使用`set -e`时,至少在第一个值是零(`i = 0`)时,应该执行** pre **递增,即`((++ i))`。否则,您的程序将在第一个增量处立即停止,因为退出代码将为1。参见https://unix.stackexchange.com/questions/32250/why-does-a-0-let-a-return-exit-code-1 (2认同)