角かっこは、条件付きテストを実行するための省略表記です。括弧[
と[[
は、信じられないかもしれませんが、Unix内の実際のコマンドです。
考えてみてください:
$ [ -f /etc/rc.local ] && echo "real file" real file -and- $ test -f /etc/rc.local && echo "real file" real file
Bashでは、[
は組み込みコマンドであり実行可能ファイルです。 [[
はBashの単なるキーワードです。
例
これは、type
:
$ type -a [ [ is a shell builtin [ is /usr/bin/[ $ type -a [[ [[ is a shell keyword
ここで物理的な実行可能ファイルを確認できます:
$ ls -l /usr/bin/[ -rwxr-xr-x 1 root root 37000 Nov 3 2010 /usr/bin/[
builtins vs .keywords
Bashのmanページman bash
を見ると、2の定義が次のようになっています。
-
キーワード-予約語は、シェルにとって特別な意味を持つ単語です。次の単語は次のとおりです。引用符で囲まれておらず、単純なコマンドの最初の単語(下記のシェルグラマーを参照)またはケースの3番目の単語またはコマンドのいずれかで予約語として認識されます:
! case do done elif else esac fi for function if in select then until while { } time [[ ]]
-
builtins -コマンド名にスラッシュが含まれていない場合、シェルはそれを見つけようとします。その名前のシェル関数が存在し、その関数は上記のFで説明したように呼び出されますUNCTIONS。名前が関数と一致しない場合、シェルはシェル組み込みのリストでその名前を検索します。一致するものが見つかった場合、そのビルトインが呼び出されます。
名前がシェル関数でもビルトインでもなく、スラッシュが含まれていない場合、bashはPATHの各要素で実行可能ファイルを含むディレクトリを検索します。その名前。 Bashは、ハッシュテーブルを使用して、実行可能ファイルのフルパス名を記憶します(以下のSHELL BUILTINコマンドのハッシュを参照してください)。 PATH内のディレクトリの完全な検索は、コマンドがハッシュテーブルに見つからない場合にのみ実行されます。検索が失敗した場合、シェルはcommand_not_found_handleという名前の定義済みシェル関数を検索します。その関数が存在する場合は、元のコマンドと元のコマンドの引数を引数として呼び出され、関数の終了ステータスがシェルの終了ステータスになります。その関数が定義されていない場合、シェルはエラーメッセージを出力し、127の終了ステータスを返します。
マニュアルページ
Bashのmanページに詳細が表示されます。
test expr [ expr ] Return a status of 0 or 1 depending on the evaluation of the conditional expression expr. Each operator and operand must be a separate argument. Expressions are composed of the primaries described above under CONDITIONAL EXPRESSIONS. test does not accept any options, nor does it accept and ignore an argument of -- as signifying the end of options.
最後にmanページから:
test and [ evaluate conditional expressions using a set of rules based on the number of arguments.
編集#1
OPからのフォローアップ質問。
わかりました。なぜですか? 「if」が必要ですか?つまり、「[」で十分な場合でも「if」が存在するのはなぜですか。
if
は条件の一部です。test
コマンドまたは[ ... ]
コマンドは、条件を評価し、0またはa 1. 0または1は、ifステートメントによって処理されます。2は、使用時に一緒に機能します。
例
if [ ... ]; then ... do this ... else ... do that ... fi
コメント
ああ、私のお気に入りのトピックの1つです!!
角かっこは、「test」コマンドの同義語です。テストのマニュアルページを読むと、「テストコマンドは
test -r /etc/profile.d/java.sh
または
ブラケットとその内側と外側にあるものの間のスペースが必要です。
この場合の「test」コマンドは、ファイル/ etc /かどうかを確認します。 profile.d / java.shは、現在のユーザーが読み取ることができます。もちろん、存在するかどうかを確認するためのチェックが含まれています。:-)
&&
は、「左側のコマンドが成功した場合、右側のコマンドを実行する」のbash構文ショートカットです。したがって、この複合コマンドは、次のような「if-then」の省略形です。
if test -r /etc/profile.d/java.sh then /etc/profile.d/java.sh fi
これで、二重角かっこも表示されます。 bashのmanページで説明されています。これらは拡張テスト関数のbash内部バージョンです。これらは完全に同じではないことに注意してください。「test」コマンドとその「test」コマンドでは実行できないことがあります。 [“同義語。
コメント