LinuCレベル1 シェルおよびスクリプト 問15
シェルおよびスクリプト/シェルスクリプトシェルスクリプト内でshiftコマンドを引数なしで1回実行したときの動作として適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル1の出題範囲「シェルおよびスクリプト」に対応。実際の試験問題ではありません)
- A位置パラメータが1つずつ前にずれ、$2の値が$1になる
- B位置パラメータが1つずつ後ろにずれ、$1の値が$2になる
- Cすべての位置パラメータが消去され、$#の値が0になる
- Dスクリプト名を表す$0が、1番目の引数の値に置き換わる
正解:A
解説
shiftは位置パラメータを左(前)へ1つずらすコマンドです。実行すると元の$1は捨てられ、$2が$1に、$3が$2になり、引数の個数を表す$#も1つ減ります。「shift 2」のように数を指定すれば、その数だけまとめてずらせます。whileループで$1を処理してはshiftする、という書き方で、個数の決まっていない引数を順に処理できます。なお$0(スクリプト名)はshiftの影響を受けません。
選択肢ごとの解説
- A正しい。shiftで元の$1が捨てられ、$2以降が1つずつ前に詰められます。$#も1減ります。
- B誤り。ずれる向きが逆です。shiftは前(左)へ詰めるので、$2の値が$1になります。
- C誤り。shiftが捨てるのは先頭の1つ(引数指定時はその個数)だけで、すべては消去しません。
- D誤り。$0はスクリプト名のままで、shiftの影響を受けません。変わるのは$1以降です。