February 27, 2023

Bashのシェルスクリプトでインクリメント(デクリメント)するには

そのまま『++』を付けてもダメ

$ i=1 ; echo ++$i
++1
$ i=1 ; ++$i
-bash: ++1: コマンドが見つかりません
$ i=1 ; ++i
-bash: ++i: コマンドが見つかりません

『(())』または『$(())』で囲むか、

$ i=1 ; ((++i)) ; echo $i
2
$ i=1 ; echo $((++i))
2

ビルトインコマンドの『let』を使う

$ i=1 ; let "++i" ; echo $i
2

インクリメントには『+』『+=』『++』が、
デクリメントには『-』『-=』『–』が使える。

こんな感じ

#!/bin/bash

i=1

echo "---------------"
echo "x=$i , y=$i , z=$i"
echo "-> Increment"

# +
x=$i y=$i z=$i
x=$((x+1))
((y=y+1))
let "z=z+1"
echo "x=$x , y=$y , z=$z"

# +=
x=$i y=$i z=$i
x=$((x+=x))
((y+=y))
let "z+=z"
echo "x=$x , y=$y , z=$z"

# ++
x=$i y=$i z=$i
x=$((++x))
((++y))
let "++z"
echo "x=$x , y=$y , z=$z"

echo "---------------"
echo "x=$i , y=$i , z=$i"
echo "-> Decrement"

# -
x=$i y=$i z=$i
x=$((x-1))
((y=y-1))
let "z=z-1"
echo "x=$x , y=$y , z=$z"

# -=
x=$i y=$i z=$i
x=$((x-=x))
((y-=y))
let "z-=z"
echo "x=$x , y=$y , z=$z"

# --
x=$i y=$i z=$i
x=$((--x))
((--y))
let "--z"
echo "x=$x , y=$y , z=$z"

実行結果はこうなる

$ ./test.sh
---------------
x=1 , y=1 , z=1
-> Increment
x=2 , y=2 , z=2
x=2 , y=2 , z=2
x=2 , y=2 , z=2
---------------
x=1 , y=1 , z=1
-> Decrement
x=0 , y=0 , z=0
x=0 , y=0 , z=0
x=0 , y=0 , z=0

© 2020 nissy-lab.com