English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Shell プロセス制御

Shell プロセス制御

Java、PHPなどの言語とは異なり、shのプログラム制御は空にできません。以下はPHPのプログラム制御の書き方です:

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // 何もしない
}

sh/bashではこのように書かないでください、else 分岐に何も実行されない場合、この else を書かないでください。

if else

fi

if 文法形式:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

一行に書く(ターミナルのコマンドプロンプトに適用):

if [ $(ps -ef | grep -c \ -gt 1 ]; then echo "true"; fi

末尾の fi は if を逆に書いたもので、後にも出てきます。

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

以下の例では、二つの変数が等しいかどうかを判断する方法を示します:

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ループの一般的な形式は:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

一行に書くと:

for var in item1 item2 ... itemN; do command1; command2... done;

変数の値がリストにある場合、forループはリストの現在の取得値を使用して全ての命令を実行します。コマンドは任何の有効なshellコマンドと文です。リストには置換、文字列、ファイル名を含むことができます。

リストはオプションです。リストを使用しない場合、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

文字列の文字を順序で出力します:

#!/bin/bash
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は 1 最初から、intが加 1。上記のスクリプトを実行すると、数字が返されます 1 まで 5、それで終了します。

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

スクリプトを実行し、以下の出力:

1
2
3
4
5

上記の例では Bash let 命令を使用しています。これは一つまたは複数の式を実行し、変数の計算では変数に$を付けずに済みます。詳細は参照してください:Bash let 命令

whileループはキーボード情報を読み取るために使用できます。以下の例では、入力情報が変数FILMに設定され、Ctrl-D> 終了ループ。

echo 'Ctrlキーを押して-D> 終了'
echo -n 'あなたが好きなウェブサイト名を入力してください: '
while read FILM
do
    echo "はい!$FILM は良いサイトです"
done

スクリプトを実行し、以下のような出力が出力されます:

Ctrlキーを押して-D> 終了
あなたが好きなウェブサイト名を入力してください:基本チュートリアルウェブ
はい!基本チュートリアルウェブは良いサイトです

無限ループ

無限ループの语法形式:

while :
do
    command
done

または

while true
do
    command
done

または

for (( ; ; ))

until ループ

until ループは条件が true になるまでコマンドを一連に実行します。

until ループと while ループは処理方法が逆です。

一般的に while ループは until ループよりも優れていますが、特定の状況では(非常に稀な場合)、until ループがより有効です。

until 文法形式:

until condition
do
    command
done

condition は一般的に条件表現であり、返り値が false ならば、ループ内の文を続行し、true ならばループを終了します。

以下の例では、until コマンドを使用して 0 ~ 9 の数字:

#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

実行結果:

出力結果は:

0
1
2
3
4
5
6
7
8
9

case ... esac

case ... esac 多選択文です。他の言語の switch ... case 文と似ており、多枝選択構造です。各 case 分枝は右括号で始まり、;; で break と表示され、実行が終了し、case ... esac 文全体から抜け出します。esac(caseの逆)が終了マークです。

case 文を使って値とパターンを一致させることができます。一致が成功すると、相匹配の命令を実行します。

case ... esac 语法形式如下:

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

以下のスクリプトは文字列を一致させる:

#!/bin/sh
site="w3codebox"
case "$site" in
   "w3codebox") echo "基本チュートリアルウェブ" 
   ;;
   "google") echo "Google 検索" 
   ;;
   "taobao") echo "淘宝网" 
   ;;
esac

出力結果は:

基础教程网

ループから退出

ループの過程で、ループの終了条件に達していない場合に強制的にループを退出する必要があることがあります。Shellはこの機能を実現するために二つのコマンドを使用します:breakとcontinue。

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 の間の! ゲーム終了

continue

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

コードを実行すると、入力が5の数字の場合、この例のループは終了しません。文echo "ゲーム終了"決して実行されない。