「シェルスクリプトの基礎 - 条件分岐」の版間の差分

ナビゲーションに移動 検索に移動
106行目: 106行目:
<center>
<center>
'''数値の比較条件'''<br>
'''数値の比較条件'''<br>
{| class="wikitable"
{| class="wikitable" style="background-color:#fefefe;"
|-
|-
! 条件 !! 比較内容
! style="background-color:#00ffff;" | 条件  
! style="background-color:#00ffff;" | 比較内容
|-
|-
| 数値1 -eq 数値2 || 数値1と2が等しい場合に真
| 数値1 -eq 数値2 || 数値1と2が等しい場合に真
126行目: 127行目:
<center>
<center>
'''文字の比較条件'''<br>
'''文字の比較条件'''<br>
{| class="wikitable"
{| class="wikitable" style="background-color:#fefefe;"
|-
|-
! 条件 !! 比較内容
! style="background-color:#00ffff;" | 条件  
! style="background-color:#00ffff;" | 比較内容
|-
|-
| -n 文字列 || 文字列の長さが0より大きい場合は真
| -n 文字列 || 文字列の長さが0より大きい場合は真
142行目: 144行目:
<center>
<center>
'''ファイルの比較条件'''<br>
'''ファイルの比較条件'''<br>
{| class="wikitable"
{| class="wikitable" style="background-color:#fefefe;"
|-
|-
! 条件 !! 比較内容
! style="background-color:#00ffff;" | 条件  
! style="background-color:#00ffff;" | 比較内容
|-
|-
| ファイル1 -nt ファイル2 || ファイル1がファイル2より新しく作成・更新されていた場合は真
| ファイル1 -nt ファイル2 || ファイル1がファイル2より新しく作成・更新されていた場合は真
172行目: 175行目:
<center>
<center>
'''ANDとORとNOT'''<br>
'''ANDとORとNOT'''<br>
{| class="wikitable"
{| class="wikitable" style="background-color:#fefefe;"
|-
|-
! 条件 !! 比較内容
! style="background-color:#00ffff;" | 条件  
! style="background-color:#00ffff;" | 比較内容
|-
|-
| ! 条件式 || 条件式が偽なら真(NOT)
| ! 条件式 || 条件式が偽なら真(NOT)
183行目: 187行目:
|}
|}
</center>
</center>
<br>
==== if 文の応用 ====
条件式に任意のコマンドを使用する。<br>
<br>
if文は、条件式に指定したコマンドの終了ステータスを判定して、条件分岐を行う制御文である。<br>
したがって、条件式には<code>test</code>コマンド以外にも、<code>ls</code>コマンドや<code>grep</code>コマンド等の一般的なコマンドを使用することもできる。<br>
<syntaxhighlight lang="sh">
if echo "$var" | grep -sq "hoge"; then
    echo "hogeが見つかりました。"
fi
# または
if echo "$var" | grep "hoge" 1>/dev/null 2>/dev/null; then
    echo "hogeが見つかりました。"
fi
</syntaxhighlight>
<br>
多くの場合、条件式に指定するコマンドで実行結果の出力を行う必要が無いため、<br>
出力を抑制するオプションを指定するか、または、<code>1>/dev/null 2>/dev/null</code>を指定して全ての出力を非表示にするとよい。<br>
例えば、<code>grep</code>コマンドを条件式に指定する場合、<code>-s</code>オプションと<code>-q</code>オプションを同時に指定することで、エラー出力と標準出力を抑制することができる。<br>
<br>
条件式にコマンドを指定しない場合、if文により、直前のコマンドの終了ステータスを表す特殊変数<code>$?</code>を判定する。<br>
<syntaxhighlight lang="sh">
# コマンドの実行結果をif文で判定する
echo "$var" | grep -sq "hoge"
if [ $? -eq 0 ]; then
    echo "hogeが見つかりました。"
fi
</syntaxhighlight>
<br>
終了ステータスを使い回す場合は、任意の変数に格納して終了ステータスを退避することで、特殊変数<code>$?</code>が他のコマンドによって上書きされても影響を受けない。<br>
<syntaxhighlight lang="sh">
echo "$var" | grep -sq "hoge";
result=$?
# ...他の処理
if [ $result -eq 0 ]; then
    echo "hogeが見つかりました。"
fi
</syntaxhighlight>
<br><br>
<br><br>


案内メニュー