【问题标题】:increment variable in a string in shell script在shell脚本中增加字符串中的变量
【发布时间】:2016-05-02 14:42:10
【问题描述】:

我有一个来自变量的字符串 我想增加它。如何使用 shell 脚本做到这一点?

这是我的输入,来自一个变量:

abc-ananya-01

输出应该是:

abc-ananya-02

【问题讨论】:

    标签: bash sh


    【解决方案1】:

    它更短:

    a=abc-lhg-08
    echo ${a%-*}-`printf "%02d" $((10#${a##*-}+1))`
    abc-lhg-09
    

    更好:

    a=abc-lhg-08
    printf "%s-%02d\n" ${a%-*} $((10#${a##*-}+1))
    abc-lhg-09
    

    【讨论】:

    • 这个答案不需要bash 4,甚至任何bash 扩展;它可以在任何 POSIX shell 中工作。
    • 在我的第一个示例中,我发现了一个基本问题并纠正了它。最初的第一个示例不能与 abc-lhg-08 或 abc-lhg-09 输入一起使用。当有前导零时,我不得不抑制 bash 的自动八进制解释,并明确指示基数 10 10#。我告诉你我的意思:a=08;echo $(($a)) bash: 08: value too great for base (error token is "08") a=08;echo $((10#$a)) 8 没有理由同时使用 echo 和 printf 所以第二个例子更适合。
    【解决方案2】:

    检查一下:

    kent$  echo "abc-ananya-07"|awk -F'-' -v OFS='-' '{$3=sprintf("%02d",++$3)}7' 
    abc-ananya-08
    

    上面的代码做增量并保持你的数字格式。

    【讨论】:

      【解决方案3】:

      这里可以使用 Bash 字符串操作。

      a='abc-ananya-07'
      let last=$(echo ${a##*-}+1)
      echo ${a%-*}-$(printf "%02d" $last)
      

      【讨论】:

      • 此解决方案不适用于以下输入:a='abc-ananya-08' 或 a='abc-ananya-09' bash 错误:bash: let: last=08: value too非常适合基础(错误标记是“08”)我的正确答案在这里:[stackoverflow.com/a/36934535/4581311]
      【解决方案4】:

      纯 Bash 有点长:

      IFS="-" read -r -a arr <<< "abc-ananya-01"
      last=10#${arr[${#arr}-1]}    # to prevent getting 08, when Bash 
                                   # understands it is a number in base 8
      last=$(( last + 1 ))
      arr[${#arr}-1]=$(printf "%02d" $last)
      ( IFS="-"; echo "${arr[*]}" )
      

      这会读入一个数组,递增最后一个元素并将其打印回来。

      返回:

      abc-ananya-02
      

      【讨论】:

      • bash 4.3 现在允许负下标,所以你可以写last=$((${arr[-1]}+1))(它足够短,可以使单行合理)。
      • 实际上,您可以使用printf -v arr[-1] "%02d" $((arr[-1]+1)) 来完全避免需要临时的last 变量。
      • 此解决方案不适用于以下输入:a='abc-ananya-08' 或 a='abc-ananya-09' bash 错误:bash: let: last=08: value too非常适合基础(错误标记是“08”)我的正确答案在这里:[stackoverflow.com/a/36934535/4581311]
      • @LászlóSzilágyi 是的,没有检查过那个。已更新,谢谢。
      猜你喜欢
      • 2021-01-11
      • 2020-04-01
      • 2011-10-13
      • 1970-01-01
      • 2012-11-02
      • 2014-08-06
      • 2018-09-20
      • 2014-04-06
      • 1970-01-01
      相关资源
      最近更新 更多