LinuCレベル1 シェルおよびスクリプト 問23
シェルおよびスクリプト/シェルスクリプトシェルスクリプト backup.sh は「コピー元」と「コピー先」の2つの引数を必要とする。渡された引数の個数が2でないときに使い方を表示して終了させたい。if文の条件として適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル1の出題範囲「シェルおよびスクリプト」に対応。実際の試験問題ではありません)
- A[ $# -ne 2 ]
- B[ $? -ne 2 ]
- C[ $0 -ne 2 ]
- D[ $* -ne 2 ]
正解:A
解説
特殊変数$#には、スクリプトに渡された位置パラメータ(引数)の個数が入ります。「[ $# -ne 2 ]」は、引数の個数が2と等しくないときに真となるため、引数の過不足を検出して使い方を表示し、exit 1などで終了させる処理に使えます。-neは数値として比較する演算子で、文字列の比較には!=を使います。$0はスクリプト自身の名前、$?は直前のコマンドの終了ステータス、$*はすべての引数を表します。
選択肢ごとの解説
- A正しい。$#は引数の個数なので、個数が2でないときに条件が真になります。
- B誤り。$?は直前に実行したコマンドの終了ステータスで、スクリプトに渡された引数の個数ではありません。
- C誤り。$0は実行されたスクリプト自身の名前(例: ./backup.sh)で、数値ではないため-neで比較するとエラーになります。
- D誤り。$*はすべての引数を並べたものです。引数が2つあると「[ a b -ne 2 ]」のように展開されて、引数が多すぎるというエラーになります。