【发布时间】:2016-05-02 14:42:10
【问题描述】:
我有一个来自变量的字符串 我想增加它。如何使用 shell 脚本做到这一点?
这是我的输入,来自一个变量:
abc-ananya-01
输出应该是:
abc-ananya-02
【问题讨论】:
我有一个来自变量的字符串 我想增加它。如何使用 shell 脚本做到这一点?
这是我的输入,来自一个变量:
abc-ananya-01
输出应该是:
abc-ananya-02
【问题讨论】:
它更短:
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 中工作。
a=08;echo $(($a)) bash: 08: value too great for base (error token is "08") a=08;echo $((10#$a)) 8 没有理由同时使用 echo 和 printf 所以第二个例子更适合。
检查一下:
kent$ echo "abc-ananya-07"|awk -F'-' -v OFS='-' '{$3=sprintf("%02d",++$3)}7'
abc-ananya-08
上面的代码做增量并保持你的数字格式。
【讨论】:
【讨论】:
纯 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 变量。