シェルプログラミングの条件ステートメントとケースステートメント

状態テスト

1.1ファイルのテスト

指定されたパス名に従って、それがファイルまたはディレクトリに対応するかどうかを判断します。または、ファイルが読み取り可能、書き込み可能、​​実行可能かどうかを判断します。
一般的なファイル操作オプションは次のとおりです。

操作オプション 説明
-d (ディレクトリ)ディレクトリかどうかをテストする
-e (存在)ディレクトリまたはファイルが存在するかどうかをテストします
-f (ファイル)ファイルかどうかをテストする
-r (読み取り)現在のユーザーに読み取り権限があるかどうかをテストします
-w (書き込み)現在のユーザーに書き込み権限があるかどうかをテストします
-バツ (実行)実行権限が設定されているかどうかをテストします

条件テスト操作を実行した後、テストコマンドの戻りステータス値は、事前定義された変数 "$?"を通じて取得できます。戻り値が0の場合、条件が満たされていることを意味します。戻り値が0ではない場合(通常は1)は、条件が真でないことを意味します。2つのファイル間の
ここに画像の説明を挿入
直接出力
ここに画像の説明を挿入
比較

操作オプション 説明
-nt ファイルAがファイルBよりも新しいかどうかを判別する
-ot ファイルAがファイルBより古いかどうかを判別する
-ef 2つのファイルが同じiノードを指しているかどうかを判断するために使用される、2つのファイルが同じファイルかどうかを判断する

ここに画像の説明を挿入

1.2整数値の比較

操作オプション 説明
-eq 最初の整数は2番目の整数と等しい
-生まれ 最初の数は2番目の数と等しくありません
-gt 最初の数は2番目の数より大きい
-lt 最初の数は2番目の数よりも小さい
- 最初の数値が2番目の数値以下である
-与える 最初の数は2番目の数以上です

例:
現在ログインしているユーザーの数を確認し、5を超えると「多すぎる」と出力し、
ここに画像の説明を挿入
拡張された
ifステートメントもこの形式で記述できます
ここに画像の説明を挿入

1.3文字列の比較

操作オプション 説明
= 最初の文字列は2番目の文字列と同じです
!= 最初の文字列は2番目の文字列とは異なります
-あり 文字列が空(ゼロ)かどうかを確認します

[文字列1 =文字列2]
[文字列1!=文字列2]
[-z文字列]
ここに画像の説明を挿入
注意
等号の両側にスペースがある場合は、両側に二重引用符を追加する必要があります。左側の変数が二重引用符を追加しない場合、等号の両側にスペースは必要ありません。

2つのifステートメント

2.1 ifステートメントの単一分岐構造

単一ブランチ選択構造の場合、対応するコードは条件が満たされた場合にのみ実行され、それ以外の場合は何も実行されません。1つの状況のみを決定する必要がある場合は、単一の分岐構造を使用できます。
ここに画像の説明を挿入

if 条件测试操作 
then
	命令序列
fi

例:

a=2
b=1
if [ $a -gt $b ]
then
	echo "$a$b大"
fi

条件付きテストとして書くこともできます

[root@localhost ~]# [ $a -gt $b ] && echo "${a}bi${b}da"

ここに画像の説明を挿入

2.2 ifステートメントの二重分岐構造

二重分岐選択構造は、「条件が満たされている」と「条件が満たされていない」の2つのケースに対して異なる操作を実行します。決定結果を2つの状況で議論する必要がある場合は、一般的にデュアルブランチ構造が採用されます。
ここに画像の説明を挿入

if 条件测试操作 
then
	命令序列1
else
	命令序列2
fi

例:

#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null	//表示ping3次,每次间隔0.2秒,等待超时3秒;$1表示第一个位置参数
if [ $? -eq 0 ]		//判断前一条命令的返回状态
then
	echo "Host $1 is up."
else
	echo "Host $1 is down."
fi

条件付きテストとして作成

[root@localhost ~]# [ $? -eq 0 ] && echo "up" || echo "down"

ここに画像の説明を挿入

2.3 ifステートメントのマルチブランチ構造

マルチブランチ選択構造は、さまざまな状況でさまざまな操作を実行します。マルチブランチ構造は、決定結果を3つ以上の状況で議論する必要がある場合に使用できます。
ここに画像の説明を挿入

if 条件测试操作1 
then
	命令序列1
elif 条件测试操作2
then
	命令序列2
else
	命令序列3
fi

例:

#!/bin/bash
read -p "请输入你想考的分数:" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
        echo "$GRADE 分,优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
        echo "$GRADE 分,合格"
else
        echo "$GRADE 分,不及格"
fi

条件付きステートメント

[root@localhost ~]# [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] && echo "$GRADE 分,优秀" || [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] && echo "$GRADE 分,合格" || echo "$GRADE 分,不及格"

ここに画像の説明を挿入

2.4 $ 0の魔法の効果

上記のプログラムの堅牢性は、他の異常なスコアを入力するとデフォルトで「不適格」と表示されるため、さらに改善する必要があります。現時点では、$ 0を使用して現在のプログラムに戻り、ユーザーに0〜100のスコアなどの通常のスコアを入力させることができます。 。

if语句判断成绩
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
cj(){
    
    
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
        echo "$GRADE 分,优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
        echo "$GRADE 分,合格"
else
        echo "$GRADE 分,不及格"
fi
}

if [ $GRADE -gt 100 ] | [ $GRADE -lt 0 ]
then
        echo "please input right number"
        $0
else
        cj
fi

3つのケースステートメント

複数分岐のifステートメントをcaseステートメントで書き換えることができるため、操作によって構造がより明確になります。
ここに画像の説明を挿入

case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	......
	
*)
	默认命令序列
esac

例1:
結果のランキングを判断します。caseステートメントは範囲([0-9]、[az]、[AZ]を除く)と一致しないため、ここに範囲のすべての数値を分類する関数判断()を記述できます1つのタイプで同じ値を返し、caseステートメントを使用して値を分類および判断します。
方法1:

#!/bin/bash
read -p "请输入你想考的分数:" GRADE
judge(){
    
    
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
        echo "a"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
        echo "b"
fi						//else可省略
}

case `judge` in			//调用函数judge()
a)
        echo "$GRADE 分,优秀"
        ;;
b)
        echo "$GRADE 分,合格"
        ;;
*)
        echo "$GRADE 分,不及格"
esac

方法2

#!/bin/bash
read -p "请输入你的成绩:" GRADE
case "$GRADE" in
#[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])
[1-5][0-9]|[0-9])
        echo "你的成绩不合格"
        ;;
6[0-9]|7[0-4])
        echo "你的成绩合格"
        ;;
7[5-9]|8[0-4])
        echo "你的成绩良好"
        ;;
8[5-9]|9[0-9]|100)
        echo "你的成绩优秀"
        ;;
*)
        echo "输入有误"
esac

例2:
シェルスクリプトを使用してhttpスイッチ操作を実装します
ここに画像の説明を挿入
。Awkは抽出フィールドを表します。これについては、次のブログで詳しく説明します

おすすめ

転載: blog.csdn.net/cenjeal/article/details/107970330