シェルプロセス制御
Java、PHP、その他の言語とは異なり、sh のプロセス コントロールは次のように空にすることはできません (以下は PHP プロセス コントロールの書き方です):
<?php if (isset($_GET["q"])) { search(q); } else { // 不做任何事情 }
sh/bash では、else 分岐の場合、このように書くことはできません実行するステートメントがない場合は、これを他に書かないでください。
if else
if
if ステートメントの構文形式:
if condition then command1 command2 ... commandN fi
1 行で記述 (ターミナル コマンド プロンプトに適用):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
最後の fi は、スペルを逆にすると、後ほど似たものに遭遇します。
if else
if else 文法形式:
if condition then command1 command2 ... commandN else command fi
if else-if else
if else-if else 文法形式:
if condition1 then command1 elif condition2 then command2 else commandN fi
次の例では、2 つの変数が等しいかどうかを判断します:
a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi
出力結果:
a 小于 b
if else ステートメントは、以下に示すように、テスト コマンドと組み合わせてよく使用されます:
num1=$[2*3] num2=$[1+5] if test $[num1] -eq $[num2] then echo '两个数字相等!' else echo '两个数字不相等!' fi
出力結果:
两个数字相等!
for ループ
他のプログラミング言語と同様に、シェルは for ループをサポートします。
for ループの一般的な形式は次のとおりです:
for var in item1 item2 ... itemN do command1 command2 ... commandN done
1 行で記述します:
for var in item1 item2 ... itemN; do command1; command2… done;
変数値がリストにある場合、for ループはすべてのコマンドを 1 回実行し、変数名を使用してリスト内の現在の値を取得します。リスト。コマンドには、任意の有効なシェル コマンドおよびステートメントを使用できます。 in リストには、置換、文字列、ファイル名を含めることができます。
in list はオプションです。これが使用されない場合、for ループはコマンド ラインの位置パラメーターを使用します。
例: 現在のリスト内の数値を順番に出力します:
for loop in 1 2 3 4 5 do echo "The value is: $loop" done
出力結果:
The value is: 1 The value is: 2 The value is: 3 The value is: 4 The value is: 5
文字列内の文字を順番に出力します:
for str in 'This is a string' do echo $str done
出力結果:
This is a string
while ステートメント
while ループは次の目的で使用されます。一連のコマンドを継続的に実行します。これは、入力ファイルからデータを読み取るためにも使用されます。これらのコマンドは通常、テスト条件です。その形式は次のとおりです:
while condition do command done
以下は基本的な while ループです。テスト条件は次のとおりです: int が 5 以下の場合、条件は true を返します。 int は 0 から始まり、ループが処理されるたびに 1 ずつ増加します。上記のスクリプトを実行し、1 ~ 5 の数値を返して終了します。
#!/bin/sh int=1 while(( $int<=5 )) do echo $int let "int++" done
スクリプトを実行すると、次のように出力されます。
1 2 3 4 5
1 つ以上の式を実行するために使用される Bash let コマンドが使用されます。変数計算で変数を表すために $ を追加する必要はありません。詳細については、以下を参照してください。 Bash let コマンド
。while ループを使用してキーボード情報を読み取ることができます。次の例では、入力情報が変数 FILM に設定され、
echo '按下 <CTRL-D> 退出' echo -n '输入你最喜欢的电影名: ' while read FILM do echo "是的!$FILM 是一部好电影" done
スクリプトを実行すると、出力は次のようになります:
按下 <CTRL-D> 退出 输入你最喜欢的电影名: w3cschoolphp中文网 是的!w3cschoolphp中文网 是一部好电影
無限ループ
無限ループ構文形式:
while : do command done
または
while true do command done
または
for (( ; ; ))
untilloop
ループが実行されるまでtrue の場合に条件が Stop になるまで、一連のコマンドを実行します。
until ループは、処理方法の点で while ループとはまったく逆です。
一般に、while ループは until ループよりも優れていますが、場合によっては (ごくまれなケースですが) until ループの方が便利な場合があります。
until 構文形式:
until condition do command done
条件は任意のテスト条件にすることができます。テストはループの最後に発生するため、ループは少なくとも 1 回実行されます。これに注意してください。
case
シェル case ステートメントは複数選択ステートメントです。 case ステートメントを使用して、値とパターンを照合できます。照合が成功すると、照合コマンドが実行されます。 case ステートメントの形式は次のとおりです:
rrreeの場合は上記のように動作します。値の後には in という単語が続き、各パターンは右括弧で終わる必要があります。値は変数または定数にすることができます。照合の結果、値が特定のパターンに一致することが判明すると、;; まですべてのコマンドの実行が開始されます。
この値は、一致するすべてのパターンを検出します。パターンが一致すると、一致したパターンの対応するコマンドを実行した後、他のパターンは続行されません。どのパターンも一致しない場合は、アスタリスク * を使用して値を取得し、次のコマンドを実行します。
次のスクリプトは、各パターンに一致する 1 ~ 4 を入力するように求めます:
case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac
異なる内容を入力すると、異なる結果が表示されます。例:
echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
ループから抜け出す
ループ中に、場合によってはそれループ終了条件に達していない場合にループを強制的に抜け出すために必要です。シェルは、この機能を実現するために、break と continue の 2 つのコマンドを使用します。
break コマンド
break コマンドを使用すると、すべてのループから抜け出すことができます (後続のすべてのループの実行を終了します)。
以下の例では、ユーザーが 5 より大きい数値を入力するまで、スクリプトは無限ループに入ります。このループを抜け出してシェル プロンプトに戻るには、break コマンドを使用する必要があります。
输入 1 到 4 之间的数字: 你输入的数字为: 3 你选择了 3
上記のコードを実行すると、出力結果は次のようになります:
#!/bin/bash while : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esac done
Continue
Continue コマンドは Break コマンドに似ていますが、1 つの違いは、すべてのループからジャンプするのではなく、現在のループからのみジャンプすることです。
上記の例を変更します:
输入 1 到 5 之间的数字:3 你输入的数字为 3! 输入 1 到 5 之间的数字:7 你输入的数字不是 1 到 5 之间的! 游戏结束
コードを実行すると、5 より大きい数値が入力されても、この例のループは終了せず、ステートメント echo "Game is over!" は決して実行されないことがわかります。 。
esac
case の構文は、C ファミリ言語とは大きく異なります。終了マークとして esac (case の逆)、各 case 分岐の右括弧、およびブレークを示す 2 つのセミコロンが必要です。