Categories: linux

shiftコマンドの使い方を徹底解説!位置パラメータを自在に操作するLinuxシェルスクリプト術

シェルスクリプトを使って処理を自動化する際、コマンドライン引数(位置パラメータ)を扱うことは非常に重要です。たとえば、スクリプトに複数の引数を渡し、それを順番に処理したいときに便利なのが「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

このように、最初の $1apple であり、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 をうまく活用してスクリプトの品質をワンランクアップさせていきましょう。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。