shift コマンドはそのシェルにセットされている位置パラメータをシフトします。
1つずつシフトしている例
以下のスクリプトを実行すると、
a
b
c
d
e
と出力されます。
shift コマンドによって、$1 に入っている値が1つずつシフトされます。
example1.sh
set a b c d e
while [ $# -gt 0 ]
do
echo $1
shift
done
2つずつシフトしようとした場合
以下のスクリプトを実行すると、
a
c
e
e
e
と e 出力が無限に出力されます。
shift コマンドに与えた引数の数ずつ $1 に入っている値がシフトされますが、e の後に shift 2 を実行することが出来ず、永遠に e の位置にとどまってしまいます。
example2.sh
set a b c d e
while [ $# -gt 0 ]
do
echo $1
shift 2
done
サブシェル内でシフトさせた場合
サブシェル内でシフトはされますが、元のシェルではシフトされていません。
example3.sh
set a b c d e
(
while [ $# -gt 0 ]
do
echo $1
shift 1
done
echo "sub shell $#" # 0 が出力されます(つまり全ての引数がシフト済)
)
echo "main shell $#" # 5 が出力されます(つまり全くシフトされていない)