条件付きテストは、論理式の結果に応じて Linux Bash スクリプトの実行フローを分岐します。二重括弧の条件付きテストは構文を大幅に簡素化しますが、それでも独自の問題点があります。
シングルブラケットとダブルブラケット
Bash は
test
コマンドを提供します。これにより、論理式をテストできます。この式は、true または false の応答を示す応答を返します。真の応答は、戻り値 0 によって示されます。ゼロ以外は false を示します。
&&
演算子を使用してコマンド ラインで
コマンドを連鎖させると
、この機能が使用されます。コマンドは、前のコマンドが正常に完了した場合にのみ実行されます。
テストが真の場合、「Yes」という単語が出力されます。
テスト 15 -eq 15 && echo "はい"
テスト 14 -eq 15 && echo "はい"
単一括弧の条件付きテストは、
test
コマンドを模倣します。これらは式を括弧 ”
[ ]
” で囲み、
test
コマンドと同様に動作します。実際、これらは同じソース コードから作成された同じプログラムです。唯一の操作上の違いは、
test
バージョンと
[
バージョンがヘルプ リクエストを処理する方法です。
これは ソースコード からのものです:
/* --help または --version を認識しますが、
最後の引数が「]」でない場合は「[」形式。直接使用する
受け入れを避けるために、parse_long_options ではなく解析します。
略語。 POSIX では、「[ –help」および「[ –version」を使用できます。
通常の GNU 動作をしますが、「test –help」が必要です
ステータス 0 でサイレントに終了するには、「test –version」を使用します。 */
test
と
[
に助けを求め、Bash に送信された応答コードをチェックすることで、この効果を確認できます。
テスト --ヘルプ
エコー$?
[ - ヘルプ
エコー$?
test
と
[
両方ともシェルの組み込みであり、Bash に直接組み込まれることを意味します。ただし、
[
のスタンドアロン バイナリ バージョンもあります。
タイプテスト
タイプ [
ここは[
対照的に、二重括弧の条件テスト
[[
および
]]
はキーワードです。
[[
と
]]
も論理テストを実行しますが、構文が異なります。これらはキーワードであるため、単一ブラケット バージョンでは機能しないいくつかの優れた機能を使用できます。
二重括弧キーワードは Bash でサポートされていますが、 他のすべてのシェルでは使用できません。 たとえば、Korn シェルはこれらをサポートしていますが、単純な古いシェル sh はサポートしていません。すべてのスクリプトは次の行で始まります。
#!/bin/bash
これにより、Bash シェルを呼び出して スクリプトを実行する ことが保証されます。
ビルトインとキーワード
compgen
プログラムを使用してビルトインを一覧表示できます。
compgen -b | fmt -w 70
fmt
を介して出力をパイプしないと、各組み込みが独自の行にある長いリストが得られます。この場合、ビルトインを 1 つの段落にグループ化して表示すると便利です。
リストには
test
と
[
が表示されますが、
]
は表示されません。
[
コマンドは式の終わりに達したことを検出するために終了
]
を探しますが、
]
別個の組み込みではありません。これは、パラメーター リストの終わりを示すために
[
に与える単なる信号です。
キーワードを確認するには、次を使用できます。
compgen -k | fmt -w 70
[[
は 1 つのキーワードであり、]
]]
は別のキーワードであるため、[
[[
と
]]
キーワードは両方ともリストに含まれています。これらは、
if
と
fi
、
case
と
esac
のように、一致するペアです。
Bash がスクリプト (またはコマンド ライン) を解析し、一致する終了キーワードを持つキーワードを検出すると、それらの間に出現するすべてのものを収集し、キーワードがサポートする特別な処理を適用します。
組み込みの場合、組み込みコマンドに続く内容は、他のコマンド ライン プログラムへのパラメーターとまったく同じように渡されます。これは、スクリプトの作成者が変数値内のスペースなどについて特別な注意を払う必要があることを意味します。
シェルグロビング
二重括弧の条件付きテストでは、シェルのグロビングを利用できます。これは、アスタリスク「
*
」が「何でも」を意味するように展開されることを意味します。
次のテキストをエディタに入力またはコピーし、「whelkie.sh」というファイルに保存します。
#!/bin/bash
stringvar=”ウェルキー・ブルックス”
if [[ “$stringvar” == *elk* ]];
それから
echo 「警告には魚介類が含まれています」
それ以外
エコー「軟体動物を含まない」
フィ
スクリプトを実行可能にするには、
chmod
コマンド
に
-x
(実行) オプションを付けて使用する必要があります。この記事のすべてのスクリプトを試したい場合は、これを行う必要があります。
chmod +x whelkie.sh
スクリプトを実行すると、周囲の他の文字に関係なく、文字列「Whelkie」の中に文字列「elk」が見つかったことがわかります。
./whelkie.sh
注意すべき点は、検索文字列を二重引用符で囲まないことです。そうすれば、グロブは発生しません。検索文字列は文字通りに扱われます。
他の形式のシェルグロビングも許可されます。疑問符「
?
」は単一の文字に一致し、単一の角括弧は文字の範囲を示すために使用されます。たとえば、どのケースを使用すればよいかわからない場合は、範囲を指定して両方の事態に対応できます。
#!/bin/bash
stringvar=”ジャン=クロード・ヴァン・クラム”
if [[ “$stringvar” == *[cC]lam* ]];
それから
echo “警告には魚介類が含まれています。”
それ以外
エコー「軟体動物から解放されます。」
フィ
このスクリプトを「damme.sh」という名前で保存し、実行可能にします。これを実行すると、条件文が true に解決され、if 文の最初の句が実行されます。
./damme.sh
文字列の引用符
文字列を二重引用符で囲むことについては前に説明しました。そうすれば、シェルのグロブ化は発生しません。慣例では、これが良い習慣であるとされていますが、
[[
と
]]
を使用する場合は、文字列変数にスペースが含まれている場合でも、文字列変数を引用符で囲む必要はありません。次の例を見てください。
$stringvar
と
$surname
両方の文字列
変数に
はスペースが含まれていますが、条件ステートメントではどちらも引用符で囲まれていません。
#!/bin/bash
stringvar=”ヴァン・ダム”
姓=「ヴァン・ダム」
if [[ $stringvar == $surname ]];
それから
echo “姓は一致します。”
それ以外
echo “姓が一致しません。”
フィ
これを「surname.sh」というファイルに保存し、実行可能にしてください。以下を使用して実行します。
./姓.sh
両方の文字列にスペースが含まれているにもかかわらず、スクリプトは成功し、条件ステートメントは true に解決されます。これは、スペースを含むパスやディレクトリ名を扱うときに便利です。ここで、変数に有効なディレクトリ名が含まれている場合、
-d
オプションは true を返します。
#!/bin/bash
dir=”/home/dave/Documents/要作業”
if [[ -d ${dir} ]];
それから
echo “ディレクトリを確認しました”
それ以外
エコー「ディレクトリが見つかりません」
フィ
自分のコンピュータ上のディレクトリを反映するようにスクリプト内のパスを変更し、テキストを「dir.sh」というファイルに保存して実行可能にすると、これが機能することがわかります。
./dir.sh
ファイル名のグロッビングに関する注意点
[ ]
と
[[ ]]
の興味深い違いは、グロビングを含むファイル名に関連しています。 「*.sh」形式はすべてのスクリプト ファイルに一致します。単一のスクリプト ファイルが存在しない限り、単一の括弧
[ ]
を使用すると失敗します。複数のスクリプトを見つけるとエラーがスローされます。
これは単一括弧の条件文を含むスクリプトです。
#!/bin/bash
if [ -a *.sh ];
それから
echo “スクリプト ファイルが見つかりました”
それ以外
echo 「スクリプト ファイルが見つかりませんでした」
フィ
このテキストを「script.sh」に保存し、実行可能にしました。 ディレクトリにあるスクリプトの数 を確認し、スクリプトを実行しました。
ls
./script.sh
Bash がエラーをスローします。 1 つを除いてすべてのスクリプト ファイルを削除し、スクリプトを再度実行しました。
ls
./script.sh
条件付きテストは true を返し、スクリプトはエラーを引き起こしません。二重括弧を使用するようにスクリプトを編集すると、3 番目のタイプの動作が提供されます。
#!/bin/bash
if [[ -a *.sh ]];
それから
echo “スクリプト ファイルが見つかりました”
それ以外
echo 「スクリプト ファイルが見つかりませんでした」
フィ
これを「dscript.sh」というファイルに保存し、実行可能にしました。多くのスクリプトが含まれるディレクトリでこのスクリプトを実行してもエラーはスローされませんが、スクリプトはスクリプト ファイルを認識できません。
二重括弧を使用した条件ステートメントは、まれにディレクトリ内に実際に「*.sh」というファイルがある場合にのみ true に解決されます。
./dscript.sh
論理ANDとOR
二重括弧を使用すると
&&
と
||
使用できます。論理 AND および OR 演算子として。
10 は 10 に等しく、25 は 26 未満であるため、このスクリプトは条件ステートメントを true に解決する必要があります。
#!/bin/bash
最初=10
秒=25
if [[ 最初の -eq 10 && 二番目の -lt 26 ]];
それから
エコー「条件が満たされました」
それ以外
エコー「条件が失敗しました」
フィ
このテキストを「and.sh」というファイルに保存し、実行可能にして、次のように実行します。
./and.sh
スクリプトは期待どおりに実行されます。
今回は
||
を使用します。オペレーター。 10 は 15 より大きくないものの、25 は 26 より小さいため、条件ステートメントは true に解決される必要があります。最初の比較または 2 番目の比較が true である限り、条件ステートメント全体が true に解決されます。
このテキストを「or.sh」として保存し、実行可能にします。
#!/bin/bash
最初=10
秒=25
if [[ 最初 -gt 15 || 2番目 -lt 26 ]];
それから
echo “条件が満たされました。”
それ以外
echo “条件が失敗しました。”
フィ
./or.sh
正規表現
二重括弧の条件ステートメントでは
=~
演算子を使用できます。これにより、文字列内の
正規表現検索パターンが
ステートメントの残りの半分に適用されます。正規表現が満たされる場合、条件文は true とみなされます。正規表現で一致するものが見つからない場合、条件ステートメントは false に解決されます。
このテキストを「regex.sh」というファイルに保存し、実行可能にします。
#!/bin/bash
言葉=「一、二、三」
WordsandNumbers=”1 1 2 2 3 3″
email=”dave@fabricateddomain.co.uk”
マスク1=”[0-9]”
マスク2=”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}”
if [[ $words =~ $mask1 ]];
それから
echo “\”$words\” には数字が含まれています。”
それ以外
echo “\”$words\” に数字が見つかりません。”
フィ
if [[ $WordsandNumbers =~ $mask1 ]];
それから
echo “\”$WordsandNumbers\” には数字が含まれています。”
それ以外
echo “\”$WordsandNumbers\” に数字が見つかりません。”
フィ
if [[ $email =~ $mask2 ]];
それから
echo “\”$email\” は有効な電子メール アドレスです。”
それ以外
echo “\”$email\” を解析できませんでした。
フィ
二重括弧の最初のセットでは、文字列変数
$mask1
正規表現として使用します。これには、0 から 9 の範囲のすべての数字のパターンが含まれます。この正規表現を
$words
文字列変数に適用します。
二重括弧の 2 番目のセットでも、文字列変数
$mask1
を正規表現として使用しますが、今回はそれを
$WordsandNumbers
文字列変数とともに使用します。
最後の二重括弧のセットでは、文字列変数
$mask2
でより複雑な正規表現マスクを使用します。
-
[A-Za-z0-9._%+-]+
: これは、大文字または小文字の任意の文字、0 から 9 までの数字、またはピリオド、アンダースコア、パーセント記号、プラス記号またはマイナス記号と一致します。 。 「
[]」の外側の「+」は、見つかった文字の数だけこれらの一致を繰り返すことを意味します。 - @ : これは「@」文字のみに一致します。
-
[A-Za-z0-9.-]+
: これは、大文字または小文字の任意の文字、0 から 9 までの数字、ピリオドまたはハイフンと一致します。 「
[ ]」の外側の「+」は、見つかった文字の数だけ一致を繰り返すことを意味します。 - 。 : 「.」に一致します。キャラクターのみ。
-
[A-Za-z]{2,4}
: これは、任意の大文字または小文字に一致します。 「
{2,4}」は、少なくとも 2 文字、最大 4 文字と一致することを意味します。
これらをすべてまとめると、正規表現マスクは電子メール アドレスが正しく形成されているかどうかをチェックします。
スクリプト テキストを「regex.sh」というファイルに保存し、実行可能にします。スクリプトを実行すると、次の出力が得られます。
./regex.sh
最初の条件ステートメントは、正規表現が数字を探しているにもかかわらず、
$words
文字列変数に保持されている値に数字が存在しないため、失敗します。
$WordsandNumbers
文字列変数に数字が含まれているため、2 番目の条件ステートメントは成功します。
電子メール アドレスの形式が適切であるため、最後の条件ステートメントは成功します。つまり、true に解決されます。
たった一つの条件
二重括弧の条件付きテストは、スクリプトに柔軟性と読みやすさをもたらします。条件テストで正規表現を使用できるというだけでも、
[[
と
]]
の使用方法を学習する必要があります。
スクリプトが Bash など、それらをサポートするシェルを呼び出すようにしてください。





