次の bashステートメントで-aおよびオプションはどのような機能を果たしますか?-nif
if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
REFNAME=$(basename $3)
else
いわゆる予備選挙ですか-a?-n
-a file「ファイルが存在する場合は True.」という意味ですか?
-a「and」または「&&」式で 2 つの式をリンクします。このオプションは非推奨です。
-n文字列の長さがゼロでないかどうかを確認します。
テスト式を次の疑似コードに変換できます。
if ( ($1 has nonzero length) and
($2 has nonzero length) and
($3 has nonzero length) )
その式には、ファイルが存在するかどうかのチェックはなく、引数がスクリプトに提供されているかどうかのみがチェックされます。
引数-aと-nは、のマンページにあります。test
man test
演算子[ ... ]は の省略形としてよく使用されtest ...、システム上で同じ機能を持っている可能性があります。
スイッチ-aとスイッチは、コマンドがこれらのスイッチを処理しないという点-nで、厳密にはbash ifステートメントの一部ではありません。if
私はそれらを「スイッチ」と呼んでいますが、bashリンク先のドキュメントでは「プライマリ」と同じものを参照しています(おそらく、これはブール式の一部について説明するときに使用される一般的な用語であるためです)。
shスクリプトifでは、コマンドを引数として取り、それを実行し、その戻りコードをテストするコマンドです。戻りコードがコード0のブロックである場合thenは、終了するまで、fiまたは (指定されている場合)次の が実行されますelse。リターン コードが返されず0、elseステートメントが指定された場合は、次のコード ブロックがelse終了まで実行されfiます。
この効果はif、 commandtrueまたはcommand を渡すことで確認できます。これらは、それぞれ何もせず、戻り値と非値falseを返す単純なコマンドです。00
if true ; then echo true was true ; else echo true was false ; fi
if false ; then echo false was true ; else echo false was false ; fi
サンプル コードでifは[、渡すコマンドは です。これは、 としても知られていtestます。あなたが求めているスイッチを取るのはこのコマンドです。コマンドには組み込みコマンドがありbashます。そのタイプを学びtestましょう。type [組み込みコマンドのhelp場合は使用法が表示されるため、実行help [してドキュメントを参照してください。あなたのシステムには、おそらく a/bin/[と aもあり、それらのマニュアルを見ることができます/bin/test。man testビルトインの動作はtest、man ページに記載されている動作と同じではない可能性がありますが、マニュアル ページから得られる簡単な説明よりも冗長である可能性がありますがhelp [、おそらくビルトインの動作を説明しているでしょう。[かなり正確に命令します。
実行しているコマンドが であることを知っているので、その使用法testを調べhelp testたりman test、読んだりできます。これは-n、 が次の引数をテストし、空の文字列でない場合に true と評価されることを示しています。
のドキュメントにはtest、スイッチも表示されます-e。このスイッチは、次の引数をテストし、その引数が存在するファイルまたはディレクトリである場合に true と評価します。さらに便利なのは-f、次の引数が存在し、(ディレクトリやブロック デバイスなどではなく) 通常のファイルである場合に true と評価されるスイッチです。
あなたの混乱の原因は、おそらく、単項とバイナリの2 つの形式が存在する可能性があることです。が単項コンテキストで使用される場合、つまり、-a後続の引数が 1 つあり、先行する引数がない場合、その引数をファイルとして扱い、スイッチと同様にその存在をテストします。ただし、がバイナリ コンテキストで使用される場合、つまり、前に 1 つの引数があり、後に 1 つの引数がある場合、その引数は他の条件として扱われ、ブール AND 演算子として機能します。-a-e-a
移植性のために、unaryはPOSIXには見られない-a非標準の拡張機能であることに注意することが重要です。ただし、およびで使用できるため、使用が広まっている可能性があります。bashksh
cd /tmp
if [ -a test-file ] ; then
echo 1: test-file exists
else
echo 1: test-file missing
fi
touch test-file
if [ -a test-file ] ; then
echo 2: test-file exists
else
echo 2: test-file missing
fi
var=somerthing
if [ -n "$var" -a -a test-file ] ; then
echo variable var is not empty and test-file exists
fi
rm -f test-file