bashのif文で-nと-aオプションは何をするのですか?[重複しています]。
質問
はどのような機能を持つのでしょうか?
-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
. このコマンドは、ご質問のスイッチを取るものです。で
bash
は
test
コマンドは組み込みコマンドになります。
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 で使用することができます。で利用可能です。
bash
と
ksh
などがありますが、おそらく広く使われているのでしょう。
使用例
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
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bash prints リテラルの改行をエコーする \n
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み】Bashでファイル名と拡張子を抽出する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] IFS=$' \n' の正確な意味は何ですか?
-
[解決済み] シェルプログラミングで「export」は何をするのですか?重複
-
[解決済み] コマンドライン・ターミナルでの乗算
-
[解決済み] コマンドでファイルを使用し、出力を切り詰めることなく同じファイルにリダイレクトするにはどうすればよいですか?
-
[解決済み] ログファイルやコンソールへの出力の書き出し
-
[解決済み] bashのifブロックの中でboolean変数を評価する方法は?重複
-
[解決済み] zip アーカイブの中の1つのファイルを更新する方法
-
[解決済み] Bashを使用してJARからMANIFEST.MFファイルを読み込む方法
-
[解決済み] here-documentで'unexpected end of file'エラーが発生する。
-
[解決済み] Bashで文字列の一文字目を削除する