八、シェルフロー制御

5272 ワード

Java、PHPなどの言語と違って、shの流れ制御は空ではいけません。
sh/bashにはこのように書いてはいけません。もしelse分岐が実行されていないなら、このelseを書かないでください。
if else
if
if文構文フォーマット:
if condition
then
    command1 
    command2
    ...
    commandN 
fi
一行を作成します。
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
末尾のfiはif倒来スペルです。あとは似たようなものがあります。
if else
if else構文フォーマット:
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi
if else-inf else
if else-inf 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文は、testコマンドとしばしば結合して使用されます。以下のようになります。
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '      !'
else
    echo '       !'
fi
出力結果:
      !
forサイクル
他のプログラミング言語と同様に、Shellはforループをサポートします。フォーマット:
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
一行に書く:
for var in item1 item2 ... itemN; do command1; command2… done;
変数値がリストにある場合、forループはすべてのコマンドを実行し、変数名を使ってリストの現在の取得値を取得します。コマンドは、任意の効果的なshellコマンドとステートメントです。inリストには、置換、文字列、およびファイル名が含まれています。inリストはオプションです。それを使わない場合は、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以下であれば、条件は本物に戻ります。int 0から1サイクル毎に1を加算します。上記のスクリプトを実行し、数字1から5を返して終了します。
#!/bin/sh
int=1
while(( $int<=5 ))
do
        echo $int
        let "int++"
done
スクリプトを実行し、出力:
1
2
3
4
5
Bash letコマンドを使用して、1つ以上の式を実行します。変数計算には$を追加して変数を表す必要はありません。具体的には、Bash letコマンドを参照してください。whileループは、キーボード情報の読み取りに使用することができる。以下の例では、変数FILMに入力情報を設定し、ループを終了します。
echo '      '
echo -n '          : '
while read FILM
do
    echo "  !$FILM       "
done
スクリプトを実行して、以下のように出力します。
      
          : w3cschool    
  !w3cschool           
無限ループの無限ループの構文形式:
while :
do
    command
done
または
while true
do
    command
done
または
for (( ; ; ))
untilサイクル
untilループは、条件が本当の場合に停止するまで一連のコマンドを実行します。untilサイクルは、whileループとは、処理方式では正反対です。一般的にはwhileサイクルはuntilサイクルより優れていますが、ある時には─極少数の場合に、untilサイクルがより効果的です。until文法フォーマット:
until condition
do
    command
done
条件は任意の試験条件であり、テストはサイクルの最後に発生します。したがって、ループは少なくとも一回実行します。この点に注意してください。
case
Shell case文は多選択文です。マッチが成功すれば、マッチしたコマンドが実行されます。case文のフォーマットは以下の通りです。
case   in
  1)
    command1
    command2
    ...
    commandN
    ;;
  2)
    command1
    command2
    ...
    commandN
    ;;
esac
caseの働き方は上記の通りです。取得後は単語inで、各モードは右括弧で終了しなければなりません。値を取ると変数または定数になります。一致した値があるパターンに一致した後、すべてのコマンドが実行を開始します。値を取ると、マッチする各モードが検出されます。パターンが一致すると、マッチモード対応コマンドを実行した後、他のモードを続行しません。一致モードがない場合は、アスタリスク*を使って値を捕捉し、後のコマンドを実行します。以下のスクリプトプロンプトは1から4まで入力し、各モードにマッチします。
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

異なる内容を入力すると、異なる結果があります。例えば、
   1   4      :
       :
3
     3
    
循環過程では、循環終了条件に達していない時に強制的にサイクルを飛び出す必要があります。Shellは二つのコマンドを使ってこの機能を実現します。
breakコマンド
breakコマンドは、すべてのループからのジャンプを許可します。以下の例では、シナリオはデッドループに入り、ユーザ入力数が5より大きいまでは。このサイクルから飛び出すには、shellのプロンプトに戻るには、breakコマンドが必要です。
#!/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
以上のコードを実行し、出力結果は以下の通りです。
   1   5      :3
        3!
   1   5      :7
         1   5    !     
contine
continue命令はbreak命令と似ています。少しだけ違っています。すべてのサイクルから飛び出すことはなく、現在のサイクルからだけ飛び出すことができます。上記の例を修正します。
#!/bin/bash
while :
do
    echo -n "   1   5      : "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "        $aNum!"
        ;;
        *) echo "         1   5    !"
            continue
            echo "    "
        ;;
    esac
done