シェルプログラミングの条件ステートメントとループ構造
状態テスト
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は抽出フィールドを表します。これについては、次のブログで詳しく説明します