忍者ブログ

プログラミングの練習

プログラミングの問題やプログラミング関連知識、ソフトウェアのテストについてのブログです

【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