シェルスクリプトを使って処理を自動化する際、コマンドライン引数(位置パラメータ)を扱うことは非常に重要です。たとえば、スクリプトに複数の引数を渡し、それを順番に処理したいときに便利なのが「shift」コマンドです。
このshiftコマンドは、位置パラメータの順番をシフトさせていく機能を持ち、ループ処理と組み合わせて使うことで、柔軟なスクリプトを実現できます。本記事では、shiftの基本的な使い方から、実践的な使用例、注意点までをわかりやすく解説します。シェルスクリプトを学んでいる方、業務効率化を考えている方におすすめの内容です。
shiftコマンドとは?
LinuxやUNIX系のシェルスクリプトにおいて、$1, $2, $3 といった位置パラメータは、スクリプトに渡された引数を表しています。これらのパラメータを順番に処理したい場合、毎回 $1, $2, … と個別に指定するのは非効率です。
そこで登場するのが shift コマンドです。shift は「左にずらす」役割を持ち、引数を一つ前に詰めていく動作をします。つまり、$2 の値が $1 に移動し、$3 が $2 に…といった具合になります。これにより、ループを使ってすべての引数を順番に処理できるようになるのです。
基本的な使い方
まずは、基本的な shift の使い方を見てみましょう。
#!/bin/bash
echo "引数1: $1"
shift
echo "shift後の引数1: $1"
このスクリプトを sample.sh として保存し、以下のように実行すると:
bash sample.sh apple banana cherry
出力結果:
引数1: apple
shift後の引数1: banana
このように、最初の $1 が apple であり、shift することで banana が $1 に詰められたのがわかります。
ループと組み合わせて全引数を処理する
shift の真価はループ処理との組み合わせにあります。以下のようなスクリプトを考えてみましょう。
#!/bin/bash
while [ $# -gt 0 ]; do
echo "処理中の引数: $1"
shift
done
このスクリプトでは、$#(残りの引数の個数)が0になるまでループを繰り返し、毎回 $1 を処理してから shift でずらしています。
実行例:
bash loop.sh dog cat bird
出力:
処理中の引数: dog
処理中の引数: cat
処理中の引数: bird
このように、すべての引数を順番に処理することができます。
shiftの引数:複数シフトも可能
shift コマンドには数値を渡すことができ、複数の位置パラメータを一気にずらすことも可能です。
shift 2
この場合、$3 の値が $1 に詰められます。ただし、存在しない位置パラメータまでシフトしようとすると、エラーにはならずに空文字となるため注意が必要です。
実例:
#!/bin/bash
echo "最初の引数: $1"
shift 2
echo "2回シフト後の引数: $1"
bash test.sh one two three
出力:
最初の引数: one
2回シフト後の引数: three
shiftを使った簡易引数パーサーの例
実際の現場では、オプションを処理するようなスクリプトを作ることもよくあります。以下は、簡易的な引数パーサーの例です。
#!/bin/bash
while [ $# -gt 0 ]; do
case "$1" in
-n|--name)
NAME="$2"
shift 2
;;
-a|--age)
AGE="$2"
shift 2
;;
*)
echo "不明なオプション: $1"
shift
;;
esac
done
echo "名前: $NAME"
echo "年齢: $AGE"
このスクリプトでは、--name や --age といったオプションに続く値を取得し、対応する変数に格納しています。shift で2つずつずらしていくのがポイントです。
実行例:
bash parser.sh --name "田中" --age 30
出力:
名前: 田中
年齢: 30
shiftの注意点
shift を使う際には以下の点に注意が必要です:
- 引数が足りない状態で shift を行うと
$1は空になります。 shiftは$1,$2, … を上書きしていくので、一度 shift すると元の$1の値は失われます。必要なら変数に退避させておきましょう。shiftに渡す数値が$#を超えると、すべての位置パラメータが失われてしまいます。
例:
shift 100
上記のように極端な値を使うと、パラメータがすべて空になることがあります。
shiftと組み合わせると便利なコマンド
shift と一緒によく使われるコマンドをいくつか紹介します。
getopts: より高度なオプション解析に使えますが、簡易処理には shift が向いています。set --: コマンドライン引数を一度リセットし、別の値を設定する時に使います。
例:
set -- apple banana cherry
while [ $# -gt 0 ]; do
echo "$1"
shift
done
このように、任意の配列を位置パラメータとして再設定し、shiftで順次処理することも可能です。
まとめ
shift コマンドは、シェルスクリプトで複数の引数を柔軟に処理するための非常に便利なツールです。特に、ループやcase文と組み合わせることで、より汎用的なスクリプトを作成できます。基本的な動作や注意点を理解しておけば、日々のスクリプト作成がより効率的になるはずです。
ちょっとした処理から本格的な引数解析まで、shift をうまく活用してスクリプトの品質をワンランクアップさせていきましょう。
