1. ホーム
  2. bash

bashのif文で-nと-aオプションは何をするのですか?[重複しています]。

2023-10-02 11:44:20

質問

はどのような機能を持つのでしょうか? -a-n オプションは、以下のbashで実行されます。 if ステートメントを実行しますか?

if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
    REFNAME=$(basename $3)
else

-a であり -n という プライマリー ?

-a file は、「ファイルが存在すれば真になる」という意味ですか?

どのように解決するのですか?

ニットピッキング

スイッチ類 -a-n は厳密には bash if ステートメントの一部ではありません。 if コマンドはこれらのスイッチを処理しません。

プライマリとは何ですか?

私は、"switches"と呼んでいますが、これは bash のドキュメントでは、同じものを "primaries" と呼んでいます (おそらく、これはブール式の部分を議論するときによく使われる用語だからでしょう)。

背景とドキュメント

sh スクリプト if は、コマンドを引数として受け取り、それを実行し、そのリターンコードをテストするコマンドである。もしリターンコードが 0 に続くコードブロックは then を閉じるまで実行されます。 fi または (供給された場合) 次の else . もしリターンコードが 0 であり else ステートメントが提供された場合、次のコードブロックは else を閉じるまで実行されます。 fi .

この効果を見るには if というコマンドを true またはコマンド false を返す単純なコマンドです。 0 と非 0 をそれぞれ指定します。

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 . このコマンドは、ご質問のスイッチを取るものです。で bashtest コマンドは組み込みコマンドになります。 type [ を試してみてください。ビルトインコマンドの場合 help は使用法を表示するので help [ を実行すると、ドキュメントを見ることができます。あなたのシステムには、おそらく /bin/[/bin/test で、もし man test を選択すると、それらのマニュアルを見ることができます。組み込みの test の動作は、マニュアルに書かれている動作と同一ではないかもしれません。 help [ から得られる単純な説明よりも冗長である可能性がありますが、 おそらく、組み込みの [ コマンドの挙動をかなり正確に表しています。

a と -n の動作

実行中のコマンドを知ることで、そのコマンドが test を参照することができます。 help test または man test を作成し、その使い方を読みます。これによって -n は次の引数をテストし、それが空文字列でなければ真と評価されます。

のドキュメントでは test というスイッチもあります。 -e . このスイッチは次の引数をテストし、その引数が存在するファイルまたはディレクトリである場合に真と評価されます。さらに便利なのは -f スイッチで、次の引数が存在し、かつ通常のファイル(ディレクトリやブロックデバイスなどではなく)である場合に真と評価されます。

あなたの混乱の原因は、おそらく 2 つの の形式があることです。 -a : 単項と二項。時 -a が単項の文脈で使われる場合、つまり に続く一つの引数 しかし 先行する引数がない のように、引数をファイルとして扱い、その存在をテストします。 -e スイッチと同じように、引数をファイルとして扱い、その存在をテストします。しかし -a がバイナリコンテキストで使われる場合、つまり の前に一つの引数、後に一つの引数がある場合です。 のように、引数を他の条件として扱い、ブール演算のAND演算子として動作します。

移植性の観点から、単項演算子である -a は非標準の拡張で は見つかりません。 を POSIX で使用することができます。で利用可能です。 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