シェルプロセス制御


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 つのセミコロンが必要です。