過去問ドリル

LinuCレベル1 シェルおよびスクリプト 問23

シェルおよびスクリプト/シェルスクリプト

シェルスクリプト backup.sh は「コピー元」と「コピー先」の2つの引数を必要とする。渡された引数の個数が2でないときに使い方を表示して終了させたい。if文の条件として適切なものはどれか。

当サイトのオリジナル問題(LinuCレベル1の出題範囲「シェルおよびスクリプト」に対応。実際の試験問題ではありません)

正解:A

解説

特殊変数$#には、スクリプトに渡された位置パラメータ(引数)の個数が入ります。「[ $# -ne 2 ]」は、引数の個数が2と等しくないときに真となるため、引数の過不足を検出して使い方を表示し、exit 1などで終了させる処理に使えます。-neは数値として比較する演算子で、文字列の比較には!=を使います。$0はスクリプト自身の名前、$?は直前のコマンドの終了ステータス、$*はすべての引数を表します。

選択肢ごとの解説

  • A正しい。$#は引数の個数なので、個数が2でないときに条件が真になります。
  • B誤り。$?は直前に実行したコマンドの終了ステータスで、スクリプトに渡された引数の個数ではありません。
  • C誤り。$0は実行されたスクリプト自身の名前(例: ./backup.sh)で、数値ではないため-neで比較するとエラーになります。
  • D誤り。$*はすべての引数を並べたものです。引数が2つあると「[ a b -ne 2 ]」のように展開されて、引数が多すぎるというエラーになります。
LinuCレベル1の問題を演習モードで解く