2016-06-23 4 views
5

私は、次のコードスニペットの両方がPOSIX準拠したシェルに有効と考えている:POSIXシェルで "test"や "[" "]"を使うべきですか?

オプション1:

if [ "$var" = "dude" ] 
then 
    echo "Dude, your var equals dude." 
fi 

はオプション2:構文が好ましい

if test "$var" = "dude" 
then 
    echo "Dude, your var equals dude." 
fi 

とどうして?特定の状況で、他のものを使用する理由はありますか?

+0

はい、どちらも有効です。いいえ、他のものよりも優先する特別な理由はありません - それは文体的な選択です。 –

+0

'test'はおそらくプロセスフォークになり、効率が低下します。 –

+3

@willemVanOnsemは、 'test'が組み込みでないシェル上では​​、外部の'/usr/bin/[' - それを探します。あなたのオペレーティングシステム*は、外部バイナリ(しばしば '/ usr/bin/test'と同じiノードへのハードリンクで、' argv [0] 'がどのように呼び出されたかを見て、引き数' ''を引数から破棄するかどうかを決定しますリスト)。 –

答えて

6

これは広く受け入れられているガイドラインのない純粋に文体的な選択であり、機能的な違いはありません。 The bash-hackers wikiは、古典的な(POSIX準拠の)testの拡張セクションを持ち、ベストプラクティスと落とし穴に多大な注意を払っており、好むべきポジションを取っていません。また

the POSIX specification for test - それマーク廃止予定機能の多くを行いつつ - 他のより好ましいとしても形式を指定します。

つまり、testの利点の1つは、人々が他の言語からの期待に反して壊れたコードやバグの多いコードをもたらすことにはあまり役立たないということです。例えば、[ "$foo" = 1 ]ではなく[$foo=1]と書くのが普通のエラーですが、人々は広くtest$foo=1と書いてありません:test "$foo" = 1は他のシェルコマンドと同じ構文解析ルールに従っていることが視覚的に明らかであるため、同じ注意が必要です引用と空白について。


ような-a-o()、およびつ以上の引数(名前[で開始インスタンスに後続]を除く)を有する任意の使用[1]

+0

POSIXシェルは、 '-a'または' -o'を廃止するとは考えていません。 [** POSIXプログラマーズマニュアル(テスト)**](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128)私は彼らの使用に対する議論は、バッシュ後の*明晰さの欠如であると信じています'-a'を導入しました(*ファイルが存在すれば真*)。しかしPOSIXテストでは、 '&&'や '||'については言及していません。 –

+2

@ DavidC.Rankin、...あなたがリンクしているその仕様で指定されたどこでも '[OB XSI]'をクリックすると、それらのコードを説明する以下のものが開きます(したがって 'OB'は陳腐化):http://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html。 POSIXアプリケーションに厳密に準拠し、XSIアプリケーションに厳密に準拠しても、旧式の機能を使用してはならない」と述べています(この機能はPOSIX.1-2008の将来のバージョンでは削除される可能性があります)。 –

+0

@ DavidC.Rankin、...それには正当な理由があります: '-a'と' -o'の4つ以上の議論の場合、 '' x $ foo ''イディオムが値間の解釈を明確にするために必要な曖昧さがあります(特に、その値のセットに '('または ')'を含めることができる場合)を使用します。 –

関連する問題