I have a string which comes from a variable I want to increment it. how can i do that using shell script?
this is my input which comes from a variable:
abc-ananya-01
output should be:
abc-ananya-02
It is shorter:
a=abc-lhg-08
echo ${a%-*}-`printf "%02d" $((10#${a##*-}+1))`
abc-lhg-09
Even better:
a=abc-lhg-08
printf "%s-%02d\n" ${a%-*} $((10#${a##*-}+1))
abc-lhg-09
bash 4, or even any bash extensions; it will work in any POSIX shell.a=08;echo $(($a)) bash: 08: value too great for base (error token is "08") a=08;echo $((10#$a)) 8 And there is no reason to use both echo and printf so the second example more fits.Bash string manipulations can be used here.
a='abc-ananya-07'
let last=$(echo ${a##*-}+1)
echo ${a%-*}-$(printf "%02d" $last)
With pure Bash it is a bit long:
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[*]}" )
This reads into an array, increments the last element and prints it back.
It returns:
abc-ananya-02
bash 4.3 now allows negative subscripts, so you can write last=$((${arr[-1]}+1)) (it's short enough to make a one-liner reasonable).printf -v arr[-1] "%02d" $((arr[-1]+1)) to avoid the need for the temporary last variable altogether.