【问题标题】:Bash: increment a variable from a script every time when I run that scriptBash:每次运行该脚本时都会从脚本中增加一个变量
【发布时间】:2013-08-20 05:14:05
【问题描述】:

我希望每次运行该脚本时都会增加脚本中的变量。像这样的:

#!/bin/bash    
n=0   #the variable that I want to be incremented
next_n=$[$n+1]
sed -i "2s/.*/n=$next_n/" ${0}
echo $n

会完成这项工作,但如果我在设置变量的行之前将其他行添加到脚本中并且我忘记更新行sed -i "2s/.*/n=$next_n/" ${0},那就不太好。

另外我不喜欢使用另一个文件来保存变量值。

其他想法?

【问题讨论】:

    标签: bash increment auto-increment


    【解决方案1】:
    #!/bin/bash    
    n=0;#the variable that I want to be incremented
    next_n=$[$n+1]
    sed -i "/#the variable that I want to be incremented$/s/=.*#/=$next_n;#/" ${0}
    echo $n
    

    【讨论】:

    • 这可能是正确的方式。但对我不起作用。你能复习一下你的答案吗?
    • 以前好多了。问题是包含sed 命令的行也被编辑了。
    • 干得好!如果我要添加另一行,例如:m=0;#the variable that I want to be incremented,我将使用sed -i "/#the variable that I want to be incremented$/s/n=.*#/n=$next_n;#/" ${0}
    • @eeeyes 你能否评论完整的脚本,因为当我运行脚本时回答上面的值不会改变,即每次打印 0。
    【解决方案2】:

    脚本在子shell中运行,这意味着一旦脚本结束,它的变量就会被遗忘,并且不会传播到调用它的父shell。要在当前 shell 中运行命令列表,您可以 source 脚本或编写函数。在这样的脚本中,普通

    (( n++ ))
    

    会起作用 - 但只有在从同一个 shell 调用时。如果脚本应该在不同的 shell 中运行,或者甚至在关闭并再次打开机器之后,将值保存在文件中是最简单和最好的选择。不过,将变量值存储在不同的文件中可能更容易,而不是脚本本身:

    [[ -f saved_value ]] || echo 0 > saved_value
    n=$(< saved_value)
    echo $(( n + 1 )) > saved_value
    

    在脚本运行时更改脚本可能会产生奇怪的后果,尤其是当您更改脚本的大小时(可能发生在 9 → 10 时)。

    【讨论】:

    • 如果我们想限制 n 变量递增直到某个特定值,例如直到 7,然后它又回到零。 ?
    • @GURUSINGH 开始一个新问题以提出一个新问题。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2023-01-13
    • 2016-12-20
    相关资源
    最近更新 更多