【Bashハマりポイント】if文で < を使うとエラーに?引数個数 $# の正しい数値比較方法
Bashスクリプトで引数の個数($#)をチェックする際、if [ $# < 1 ] と書くと意図しないエラーが発生します。
今回は、なぜ < 記号が使えないのかという理由と、コピペしてすぐ使える正しいOKパターン(2選)を解説します。
1. やりがちなNGコードとエラー原因
他言語の感覚で [ ] 内に < を書いてしまうと、Bashではファイルリダイレクトとして解釈されます。
【NG】動かないコード例(script_ng.sh)
#!/bin/bash
# [ ] 内で < を直接使うとエラー
if [ $# < 1 ]; then
echo "Usage: $0 <argument>"
exit 1
fi
echo "Argument is: $1"
実際の実行結果(エラーメッセージ)
$ ./script_ng.sh
./script_ng.sh: line 4: 1: No such file or directory
【なぜエラーになるのか?】
Bashの
[ ] (testコマンド)において、記号 < は比較演算子ではなく「ファイルからの標準入力リダイレクト」として解釈されてしまうためです。そのため、シェルは「
1 という名前のファイルから入力を受け取ろう」として探しに行き、ファイルが見つからず No such file or directory エラーを出力します。2. 正しいOKパターン(動作コード)
数値比較を行う場合は、用途や書き方の好みに合わせて以下のいずれかを使用します。
パターンA:アルファベット演算子(-lt)を使う【標準的】
Bashを含む標準的なPOSIXシェルで最も広く使われる安全な書き方です。
#!/bin/bash
# 引数が1個未満(0個)の場合
if [ $# -lt 1 ]; then
echo "Usage: $0 <argument>"
exit 1
fi
echo "Argument is: $1"
パターンB:二重丸括弧 (( )) を使う【演算記号が使用可能】
算術評価構文(( ))を使うと、他言語と同じように<や>=などの直感的な記号で記述できます。
#!/bin/bash
# 引数が1個未満(0個)の場合
if (( $# < 1 )); then
echo "Usage: $0 <argument>"
exit 1
fi
echo "Argument is: $1"
3. 実行結果の確認
OKパターンのスクリプトを実行した際の結果です。
# 引数なしで実行した場合(使い方を表示して終了)
$ ./script_ok.sh
Usage: ./script_ok.sh <argument>
# 引数を渡して実行した場合(引数を正常に出力)
$ ./script_ok.sh hello
Argument is: hello
4. まとめ
・[ ](角括弧):アルファベット演算子(-lt/-ge/-eqなど)を使う
・(( ))(二重丸括弧):記号(</>=/==など)が使える
・注意点:[ ]の中で<を使うとファイルリダイレクト扱いになってエラーになる
Bashで数値比較を行う際は、カッコの種類([ ] か (( )) か)に合わせた演算子選びを意識しましょう。
PR