if コマンド

条件式を評価し、結果に基づいてコマンドを実行します。

概要

if コマンドはシェルの構文で、条件付き実行を可能にします。条件が真かどうかをテストし、それに応じてコードブロックを実行します。オプションで elif(else if)や else 節を含めることで、複数の条件を処理できます。

オプション

if コマンドは独立した実行ファイルではなく、シェル組み込みの構文であるため、従来のコマンドラインオプションはありません。

使用例

基本的な if 文

$ if [ -f /etc/passwd ]; then
>   echo "passwdファイルが存在します。"
> fi
passwdファイルが存在します。

if-else 文

$ if [ $USER = "root" ]; then
>   echo "あなたはrootです。"
> else
>   echo "あなたはrootではありません。"
> fi
あなたはrootではありません。

if-elif-else 文

$ count=15
$ if [ $count -lt 10 ]; then
>   echo "カウントは10未満です。"
> elif [ $count -lt 20 ]; then
>   echo "カウントは10以上20未満です。"
> else
>   echo "カウントは20以上です。"
> fi
カウントは10以上20未満です。

テスト演算子の使用

$ file="example.txt"
$ if [ -e "$file" ] && [ -w "$file" ]; then
>   echo "ファイルは存在し、書き込み可能です。"
> else
>   echo "ファイルが存在しないか、書き込みできません。"
> fi
ファイルが存在しないか、書き込みできません。

コマンドの終了ステータスの使用

$ if grep "root" /etc/passwd > /dev/null; then
>   echo "ユーザーrootが存在します。"
> fi
ユーザーrootが存在します。

ヒント:

変数は常に引用符で囲む

テスト条件では、単語分割やグロブの問題を防ぐために、常に変数を引用符で囲みましょう:

$ filename="my file.txt"
$ if [ -f "$filename" ]; then  # 引用符によりスペースの問題を防止
>   echo "ファイルが存在します"
> fi

Bashでは二重角括弧を使用する

Bashでは、[[ ]] は従来の [ ] テストコマンドよりも多くの機能を提供します:

$ if [[ "$string" == *txt ]]; then  # [[ ]]ではパターンマッチングが機能する
>   echo "文字列はtxtで終わります"
> fi

コマンドの成功を確認する

[ ] を使わずにコマンドが成功したかどうかをテストできます:

$ if ping -c1 -W1 google.com &>/dev/null; then
>   echo "ネットワークは稼働中です"
> else
>   echo "ネットワークはダウンしています"
> fi

よくある質問

Q1. [ ][[ ]] の違いは何ですか?

A. [ ] はほとんどのシェルで利用可能な従来のテストコマンドです。[[ ]] はパターンマッチングや論理演算子などの追加機能を持つBashの拡張機能です。可能な場合はBashスクリプトで [[ ]] を使用してください。

Q2. ファイルが存在するかどうかをテストするにはどうすればよいですか?

A. ファイルが存在するかを確認するには if [ -e ファイル名 ]、通常のファイルかを確認するには if [ -f ファイル名 ]、ディレクトリかを確認するには if [ -d ファイル名 ] を使用します。

Q3. 文字列を比較するにはどうすればよいですか?

A. 等しいかどうかは if [ "$string1" = "$string2" ]、等しくないかどうかは if [ "$string1" != "$string2" ] を使用します。文字列比較では単一の = を使用することに注意してください。

Q4. 数値を比較するにはどうすればよいですか?

A. -eq(等しい)、-ne(等しくない)、-lt(より小さい)、-le(以下)、-gt(より大きい)、または -ge(以上)を使用します:if [ "$num1" -eq "$num2" ]

参考文献

https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html

改訂履歴