Bashスクリプトで使用するすべてのif
スイッチのリストはありますか?誰かがそれを使用しているのを見ることがありますが、彼らが使用しているスイッチは実際に何をしているのでしょうか。
例は-z
これ。使用方法は知っていますが、どこから派生したのかわかりません。
if [ -z "$BASH_VERSION" ]; then
echo -e "Error: this script requires the BASH Shell!"
exit 1
fi
参照、ガイド、投稿、回答をいただければ幸いです。
Bashのマンページ(man bash
)を見てください。オプションはCONDITIONAL EXPRESSIONS
セクションで指定されます:
CONDITIONAL EXPRESSIONS
Conditional expressions are used by the [[ compound command and the
test and [ builtin commands to test file attributes and perform string
and arithmetic comparisons. Expressions are formed from the following
unary or binary primaries. If any file argument to one of the pri-
maries is of the form /dev/fd/n, then file descriptor n is checked. If
the file argument to one of the primaries is one of /dev/stdin,
/dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2, respectively,
is checked.
Unless otherwise specified, primaries that operate on files follow sym-
bolic links and operate on the target of the link, rather than the link
itself.
-a file
True if file exists.
... more options ...
ヘルプでも説明されています。
$ help [ [: [ arg... ]
This is a synonym for the "test" builtin, but the last
argument must be a literal `]', to match the opening `['.
はい。これらは 条件式 と呼ばれ、[[
compound command およびtest
および[
組み込みコマンド ([
は、単にtest
の同義語です。
Bash Reference Manual のセクション 6.4 Bash条件式 をお読みください。これには、これらすべてのスイッチとその使用法のリストが含まれています。
それらはif
ステートメントのスイッチではなく、test
コマンド([
はtest
組み込みの同義語です)。見る help test
完全なリストはbashで。
単一の角括弧([ ... ]
)は、test
コマンドの同義語です。 テストのマンページ を見ると、さまざまなifスイッチのほとんどすべてが表示されます(BASHには、ここで言及されていない余分なものがいくつかあります)。見つけやすい場所にすべて揃っています。
二重角括弧([[ ... ]]
)を使用する場合、テストの拡張BASHセットを使用しています。これらは主に、正規表現のマッチング、グロブマッチング(および、そのセットがあれば拡張グロブマッチング)に関係しています。そのためには、そのBASHマンページを読む必要があります。
それらをifスイッチと呼びましたが、それは実際には正しくありません。これらはtestsであり、if
コマンドとはまったく関係ありません。
if
コマンドは、指定されたコマンドを実行するだけで、そのコマンドが0
の終了コードを返した場合、if
のif
部分を実行しますステートメント。それ以外の場合、else
部分が実行されます(存在する場合)。
これを見てみましょう:
$ rm foo.test.txt # Hope this wasn't an important file
$ if ls foo.test.txt
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
ls: foo.test.txt: No such file or directory
I can't find it anywhere..
if
ステートメントはls foo.test.txt
コマンドを実行し、ls
コマンドはファイルが存在しないためゼロ以外を返します。これにより、if
ステートメントがelse
句を実行します。
もう一度試してみましょう...
$ touch foo.test.txt # Now this file exists.
$ if ls foo.test.txt # Same "if/else" statement as above
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
foo.test.txt
This file exists
ここで、ls
コマンドは0
終了ステータスを返しました(ファイルが存在し、ファイルが存在し、ls
コマンドで統計できるため)。
通常、ファイルのテストにls
コマンドを使用しないでください。ここで使用したのは、if
ステートメントがコマンドを実行し、そのコマンドの終了ステータスに応じてif
またはelse
句を実行したことを示すためです。ファイルが存在するかどうかをテストする場合は、ls
コマンドの代わりにtest -e
コマンドを使用する必要があります。
if test -e foo.test.txt # Same as above, but using "test" instead of "ls"
then
echo "This file exists"
else
echo "I can't find it anywhere.."
fi
ファイルが存在する場合、test -e
は0
の終了ステータスを返します。それ以外の場合、ゼロ以外の終了ステータスを返します。
これを行う場合:
$ ls -i /bin/test /bin/[
10958 /bin/[ 10958 /bin/test
10958
はinodeです。同じinodeを持つファイルは、同じファイルの2つの異なる名前です。したがって、[
およびtest
コマンドはソフトリンクされています1。これは、test
の代わりに[
を使用できることを意味します。
if [ -e foo.test.txt ]
then
echo "This file exists"
else
echo "I can't find it anywhere.."
fi
おなじみ?
1。 BASHでは、test
と[
が組み込まれているため、BASHでこれらのコマンドを実行すると、/bin/test
または/bin/[
は実行されません。ただし、それらはまだlinked相互に関係しています。
実際にそれらを提供しているのはif
ではありません— [
、test
という名前でよく知られています。 help test
は、使用可能なすべてのオプションのリストを提供する必要があります。気にするなら 標準 も見ることができます。