Linux Bash Shell Programming(8):条件付き判断ステートメントと例
前のセクションでは、文字列のインターセプトと処理に関連するコマンドについて学び、コマンドの出力データストリームをフィルタリングしてインターセプトできます。このセクションの冒頭では、Bash Shellプログラミングの最も重要な部分である、条件付き判断とフロー制御ステートメントについて説明しています。このセクションでは、最初に、さまざまなタイプと形式の条件付き判断について理解します。
条件付き判断の基本的な文法
条件付き判断には、主に2つの基本的な構文があります。コマンドラインベースのtest
コマンドと、プロセス制御ステートメントの埋め込みにより適した条件付きスタイルです。
- testコマンド
は、標準出力なしでコマンドラインの形式で条件判断ステートメントを実行します。ステートメントの実行結果は、事前定義された変数に保存されます$?
($?値は、ブールデータではなくプログラムの戻り値に似ていることに注意してください) 、$?0はtrue、1はfalse)、echo
コマンドで直接表示することも、複数のコマンド論理関係から呼び出すこともできますが、これはユーザーの習慣に沿ったものですが、シェルスクリプトでの使用は不便であり、一般的にシェルでの使用は推奨されません
test 条件判断语句
#为了观察实际效果,一般使用echo命令查看$?预定义变量
echo $?
#0为真,1为假
#例如:(判断语句的具体分类在下面讲到)
test -e Hello_World.sh
echo $?
-
[]
条件付きスタイルが含ま[]
組み込まれた条件を 使用して式を判断する機能はtest
、コマンドと同じです。命令構造を採用していません。これは、条件としてプロセス制御ステートメントに簡単に埋め込むことができます。戻り値は、事前定義変数にもあります$?
。異なる形式を除いて、残りはtest
コマンドとまったく同じです注:[]の内側には両側にスペースが必要です。それ以外の場合、コマンドの実行時にエラーが報告されます
[ 条件判断语句 ]
#同样使用echo命令查看条件判断语句结果
echo $?
#例如:(判断语句的具体分类在下面讲到)
[ -e Hello_World.sh ]
echo $?
条件付き判定文タイプ
ファイルの種類による判断
オプションの後にファイル名を追加して、ファイルタイプ(存在する場合)が条件を満たしているかどうかを判断します。ファイルが存在しない場合はfalseを返し、条件を満たしている場合はtrueを返します。特定のファイルタイプ識別子は、lsコマンドの結果の最初のファイル属性に似ています。
[选项 文件名]
#echo #?
オプション | 効果 |
---|---|
-b | ファイル(存在する場合(以下同じ))がブロックデバイスファイル(true(以下同じ))かどうかを判別します。 |
-c | ファイルがキャラクターデバイスファイルかどうかを判別 |
-d | ファイルがディレクトリファイルかどうかを判別 |
-e | ファイルが存在するかどうかを判断するだけです |
-f | ファイルが通常のファイルかどうかを判断します |
-L | ファイルがシンボリックリンクファイルかどうかを判別 |
-p | ファイルがパイプラインファイルかどうかを判別 |
-s | ファイルが空でないかどうかを判別します(空でないことがtrueです)。 |
-S | ファイルがソケットファイルかどうかを判別 |
ファイルの権限による判断
オプションの後にファイル名も追加します。許可がtrueの場合、許可がない場合、またはファイルが存在しない場合はfalseです。(審査は、このファイルに対する現在のユーザーの権限です)
オプション | 効果 |
---|---|
-r | ファイルに読み取り権限があるかどうかを確認します |
-w | ファイルに書き込み権限があるかどうかを確認する |
-バツ | ファイルに実行権限があるかどうかを確認する |
-u | ファイルにSUID権限があるかどうかを確認する |
-g | ファイル/ディレクトリにSGID権限があるかどうかを確認します |
-k | ディレクトリにSBIT権限があるかどうかを確認する |
2つのファイルの情報を比較する
形式:ファイル1 [オプション]ファイル2
オプション | 効果 |
---|---|
-nt | ファイル1の最終変更時刻がファイル2より遅いかどうかを判断するよりも新しい、それ以降は真(0) |
-ot | ファイル1の最終変更時刻がファイル2より早いかどうかの判断よりも古い(0) |
-ef | 2つのファイルのiノード番号が同じかどうかを判別します。これは、2つのファイルが同じかどうかに似ています。 |
- このうち、
Inode
番号はファイルを識別するシリアル番号です。2つの異なるファイルに同じ名前を付けることはできますが、iノード番号を同じにすることはできません。2つのファイルがハードリンクされている(コピーとして保存、同期更新)場合、2つのファイルのiノード番号は同じになります、残りは異なります - 2つのハードリンクされたファイルには、同じInode番号を除いて記号がありません。この判断方法を使用して、ハードリンクを判断できます。
2つの整数を比較する
2つの変数の場合、整数形式で宣言する必要はありません。構文:integer 1 [option] integer 2
オプション | 効果 |
---|---|
-eq | 2つの整数が等しいかどうかを判別 |
-生まれ | 等しくない2つの整数が等しくないかどうかを判別 |
-gt | 整数1が整数2より大きいかどうかを判断するより大きい |
-lt | 整数1が整数2より小さいかどうかを判断する未満 |
-与える | 整数1が整数2以上であるかどうかを判断する |
- | less / equalは、整数1が整数2以下かどうかを判断します |
文字列の相関関係を決定する
文法はオプションに含まれています。注:2つの文字列の比較では、関連する述語の両側にスペースが必要です。そうでない場合、戻り値はとにかくtrueになります
オプション | 効果 |
---|---|
-z文字列 | 文字列が空かどうかを判別 |
-n文字列 | 文字列が空でないかどうかを判別 |
文字列1 ==文字列2 | 2つの文字列が等しいかどうかを判別 |
文字列1!=文字列2 | 2つの文字列が等しくないかどうかを判別 |
- 文字列が変数の場合、変数が定義されていなければ、空の文字列としても扱われます
2つの判定条件の論理関係
2つの判定条件を同時に使用する場合は、両者の論理的な関係、2つの判定条件の形式に注意してください。条件1 [オプション]条件2
オプション | 効果 |
---|---|
-a | 論理AND、両方の条件が真 |
- | 論理OR、2つの条件のいずれかが真の場合 |
![条件] | 論理否定、判定結果を反転(条件と条件の間にスペースがあること! に注意) |
複数のコマンドロジックシンボルと組み合わせて使用される条件付き判断ステートメント
複数のコマンドと論理文字のシーケンスについては、Linux Bash Shell Programming(3)を参照してください:リダイレクト、複数のコマンドシーケンス、ワイルドカード、特殊記号
実際、前のコマンドが複数のコマンドシーケンスとロジックシンボルによって実行されているかどうかを判断する方法$?
は、事前定義された変数の値が0 かどうかを判断することです。そのため、条件付き判断ステートメントをコマンドとして直接処理し、それを複数のコマンドシーケンスステートメントに追加できます。条件判断はtrueです。前のステートメントの正しい実行と同等です。
例
例1.ファイルが存在するかどうかを確認します。
[ -e ./test.sh ] && echo "File exists" || echo "File not found"
#条件判断语句方括号内侧必须有空格
#该命令执行,若文件存在,显示"File exists";否则显示"File not found"
例2:マルチコマンドロジックを使用して、単一行比率プログラムを作成します。
#以下为test5.sh中的内容
#!/bin/bash
#Author:Zheng
read -p "a= " a
read -p "b= " b #通过键盘读入a,b数据,请参阅(四)
[ $a -lt $b ] && echo "a<b" || echo "a>=b"
例3:複数条件判定文:入力変数が空で値が10未満かどうかを判定する
#以下为test6.sh中内容
#!/bin/bash
#Author: Zheng
read -p "Input a: " a
#若a非空且小于10,则输出Yes
[ -n $a -a $a -lt 10 ] && echo "Yes" || echo "No"
#此脚本中未加入判断a是否为整数的条件,留待改进
インデックス
次のセクション「Linux Bash Shell Programming(9):Flow Control Statement(Part 1)Branch Statement(if、case)」では、Bashフロー制御ステートメントについて学びます
最後のセクション、Linux Bash Shellプログラミング(7):文字列のインターセプトと処理(cut、printf、awk、sed)