Bash シェルでの条件式

Niraj Menon 2023年1月30日
  1. Bash の if ステートメント
  2. 組み込みの Bash 条件
Bash シェルでの条件式

プログラミング言語としての Bash は、特に Python や C のようなはるかに一般的な言語では、ほとんどのプログラマーの頼みの綱ではありません。

if ステートメントを含む基準に基づいてコマンドを実行するプログラミング構造を作成するか、for ループを使用して複数の引数を使用する同じコマンドを作成すると便利です。

このチュートリアルでは、if ステートメントで使用される条件式の種類に焦点を当てて、Bash の if ステートメントについて説明します。

Bash の if ステートメント

Bash の if ステートメントの一般的な構文は次のとおりです。

if condition; then
    do-if-true;
elif second-condition; then
    do-else-if-true
elif third-condition; then
    do-else-if-third-true
else
    do-else-false
fi

条件自体は、必要な条件に応じて、異なる構文を持つことができます。

  • ファイルの内容を grep などの条件としてコマンドの出力を使用して、特定のサブ文字列が含まれているかどうかを確認する場合は、次のように if キーワードの後に​​コマンドを配置できます。
if greq -q "string" file.txt; then
    echo "string exists in file.txt."
else
    echo "string does not exist in file.txt."
fi
  • [ "$s" = "string" ] 変数 $s に値 string が含まれているかどうかを確認します。また、test "$s" = "string"と同等であり、test は角かっこを効果的に置き換えます。
if [ "$s" = "string" ]; then
    echo "string is equivalent to \$s"
else
    echo "string is not equivalent to \$s"
fi
  • 予想されるファイルまたはファイル内の行数が確実であるかどうか、またはディレクトリ内の数が別のディレクトリの数よりも少ないか多いかどうかを確認するなど、算術演算を実行することもできます。

    これは、括弧のペアを使用して行います。

a=$(ls dir_a | wc -l)
b=$(ls dir_b | wc -l)
if (( a < b )); then
    echo "Directory a has fewer files than directory b."
elif (( a > b )); then
    echo "Directory a has more files than directory b."
else
    echo "Directory a has the same number of files as that of directory b."
fi

組み込みの Bash 条件

別のプログラムを実行して、ファイルの存在、変更日、サイズなどの単純なものをチェックするのは面倒でリソースを消費するため、Bash は if ステートメントのようにそのような属性を直接チェックできます。

次のフラグは、これらの属性の存在または非存在をチェックし、事実上 true または false の結果を if ステートメントに返します。

たとえば、コマンドが出力を生成しなかったかどうかを確認するには、次のように、その出力を文字列として扱い、その文字列の長さがゼロかどうかを -z フラグで確認します。

out=$(bash print-if-error.sh)
if [[ -z $out ]]; then
    echo "The script ran successfully."
else
    echo "The script produced the following errors: "
    echo $out
fi

条件の逆を取得するには、!を使用できます。演算子ではないか、このフラグの逆の形式を使用します。これは、-n であるか、フラグがまったくない場合です。空でない文字列は、Bashif ステートメントで true として動作する可能性があるためです。

out=$(bash print-if-error.sh)
if [[ $out ]]; then
    echo "The script produced the following errors: "
    echo $out
else
    echo "The script ran successfully."
fi

その他の便利なフラグについては、GNUBash リファレンスマニュアルを参照して説明します。

  1. -f は、ファイルが存在し、それが通常のファイルであるかどうかを確認します。
  2. -d は、提供された引数がディレクトリであったかどうかをチェックします。
  3. -h は、提供された引数がシンボリックリンクであったかどうかをチェックします。
  4. -s は、ファイルが存在し、空でないかどうかを確認します。
  5. -r ファイルが読み取り可能かどうかを確認します。
  6. -w ファイルが書き込み可能かどうかを確認します。
  7. -x ファイルが実行可能かどうかを確認します。

比較演算子のように 2つの引数を取るフラグの場合、最初の引数はフラグの前にあり、2 番目の引数はフラグの後に表示されます。

2つのファイル(a.txt と b.txt)を比較して、-nt フラグが付いた新しいファイルを確認するとします。逆は、-ot を使用して、古いかどうかを確認します。

out=$(bash print-if-error.sh)
if [[ a.txt -nt b.txt ]]; then
    echo "a.txt is newer than b.txt."
else
    echo "a.txt is older or the same age as b.txt."
fi

その他のこのような 2 オペランドフラグは次のとおりです。

  1. -ef は、2つの引数が同じデバイスと i ノード番号を参照することを保証します。
  2. != は、2つの引数が等しくないことを保証します。
  3. < は、最初の引数が 2 番目の引数の前にアルファベット順になっていることを確認します。
  4. > は、最初の引数が 2 番目の引数の後にアルファベット順になっていることを確認します。
  5. -eq は、両方の引数が整数であると想定し、それらが等しいことを確認します。
  6. -ne は、両方の引数が整数であると想定し、それらが等しくないことを確認します。
  7. -lt は、両方の引数が整数であると想定し、最初の引数が 2 番目の引数よりも小さいことを確認します。-le を使用して、それらが等しいかどうかを確認できます。
  8. -gt は、両方の引数が整数であると想定し、最初の引数が 2 番目の引数より大きいことを確認します。-ge を使用して、それらが等しいかどうかを確認できます。

関連記事 - Bash Condition