使用 bash 递增

Posted

技术标签:

【中文标题】使用 bash 递增【英文标题】:Increment with bash 【发布时间】:2012-11-03 09:15:45 【问题描述】:

我一直在尝试增加 .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

while 循环是我刚刚用来测试代码的东西。它将插入&lt;process&gt;,但不会插入增量。

我的最终目标:

<process>value="1"</process>
<process>value="2"</process>
<process>value="3"</process>
<process>value="4"</process>

等等,只要&lt;process&gt; 存在于它需要递增的文件中。

【问题讨论】:

【参考方案1】:

这也有效。

将变量声明为整数。

declare -i i=0

然后你可以像这样递增:

i+=1

【讨论】:

恕我直言最好的答案,因为退出代码like the increment operator似乎没有任何问题。【参考方案2】:

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

i=0
((i++))

【讨论】:

当使用 set -e 时,您应该——至少当第一个值是零时 (i=0)——改为执行 pre-increment,即 ((++i))。否则,您的程序将在第一个增量处停止,因为退出代码将为 1。非常令人惊讶。见unix.stackexchange.com/questions/32250/…【参考方案3】:

对于bash 中的适当增量,请使用 for 循环(C 风格):

n=10
for ((i=1; i<=n; i++)) 
    printf '<process>value="%d"</process>\n' $i

输出

<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>

注意

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

编辑

如果我误解了您的需求,而您的文件包含这样的空白值:

<process>value=""</process>

试试这个:

$ 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>

-i 切换编辑文件,所以要小心。

【讨论】:

【参考方案4】:

使用awk:

awk 'gsub( "value=\"\"", "value=" i++ ); print ' i=1 input-file

这会将字符串value="" 替换为value="1"value="2" 等。您可以轻松更改起始值和增量(例如..."value=" i ); i+=5; print

【讨论】:

【参考方案5】:

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

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

i=`expr $i + 1`

i=$((i+1))

【讨论】:

或只是(( i++ ))。祝大家好运。 都不行。现在它为所有内容打印到 .xml 文件 value="10" 并且不会增加 @CuriousGeorge:如果你总是得到 10,那么:A. 它在哪里被设置为那个值(或者不知何故 0-9 的值被丢弃或跳过),B.当您遇到i -lt 10,“i lessThan 10”的条件时,它怎么能打印出来(也许您应该尝试(( i++ &lt; 10 ))?学习使用顶部附近的set -vx 和@987654328 打开shell 调试/跟踪功能@ 关闭跟踪。这将显示将要执行的代码行(或代码块),然后每个执行的步骤都用替换变量的值。祝你好运。 @CuriousGeorge:您的while 循环确保i 增加到10,然后您通过sed 插入该值。所以是的,这是您代码的预期行为。

以上是关于使用 bash 递增的主要内容,如果未能解决你的问题,请参考以下文章

Bash 中“while”和“until”的区别

Ubuntu中执行bash脚本出现"Global symbol "$xxx" requires explicit package name at (eval 1) lin

仅查找从一行到下一行的递增值[关闭]

Bash循环,打印当前迭代?

尝试编写 MacOS 自动化脚本以根据扫描的输入创建递增文件夹

JavaScript (++) 递增运算符