2017-07-18 4 views
1

:コマンドは、Linuxのコマンドであるシェルテストとエコーで値を引用するにはいつ ""を使うべきですか?私はこのようなbashスクリプトを書いている

VF_ETH=$(command) 
if [ -n "$VF_ETH" ] ; then 
    echo "ixgbevf eth: "$VF_ETH 
fi 

、私の質問は:

  1. $VF_ETHはなぜline2でそれを引用する""を使用し、VF_ETHの値を取得することですシェルテストで?
  2. 私が""を引用して使用しないと、テストは失敗しますか?
  3. ""の値を引用する場合は、それを文字列にすることです。なぜ、line3のエコーで使用しないのですか?

あなたがスペースを含むVF_ETH変数に格納されている実際のコマンドを取得すると仮定すると、あなたの

答えて

2

ありがとうございます。今度はif [ -n $VF_ETH ]を使用し、シェルが変数を展開するとき、-nに複数のパラメータがありますが、1つしか期待しません。したがって、binary operator expectedのようなエラーが発生する可能性があります。

また、echoコマンドでは、パラメータを1つだけ持つことは必須ではありません。したがって、二重引用符を使用していなくても動作します。

したがって、変数を展開するときには必ず二重引用符を使用してください。

また、https://www.shellcheck.net/を使用してスクリプトをチェックすると、スクリプトが間違っている場所/標準ではない場所に関する正しい情報が得られます。 1.と2.については

+0

ありがとうございます。ありがとうございました。コマンドの戻り値($ VF_ETH)が "A B C"のようなスペースを含むトークンである可能性があります。 $ VF_ETHを使うと "A"になります。 – batmancn

+0

'$ VF_ETH'は' A B C'ですが、1つの引数が1つの引数しか必要とせず、二重引用符なしで 'A B C'を渡すと3つの引数として扱われます。 – Utsav

+0

私の主張をするには、 'A B C'という名前のディレクトリを作成してみてください。まず 'mkdir A B C'を試してから、' mkdir "A B C" 'を試してみてください。あなたはその違いを理解するでしょう。 – Utsav

0

あなたが$VF_ETH="x -a -z x"を設定し、コードでそれをテストする場合:角括弧内は-n x AND -z x(空でないと空)に拡大するよう

if [ -n $VF_ETH ] ; then 
    echo yes 
else 
    echo nope 
fi 

出力がnopeになります。変数の周りに引用符を追加するとそれが修正されます。

  1. $VF_ETH="*"を設定します。あなたがecho $fooの場合、bashはワイルドカード展開を行い、echoは現在のディレクトリの内容を出力します。
1

あなたべき例えば、コマンドライン引数にと[ ... ]テスト内で使用し、常に二重引用符変数、:コマンドはと二重引用符なしに異なる値を受け取ることになります使用されているすべての上記の例で

ls "$var" 
echo "$var" 
[ -f "$var" ] 
test -f "$var" 

$varの値が空白の束で始まる場合、にはスペースが含まれています。たとえば:

var=" an apple" 
echo "$var" # prints " an apple" 
echo $var # prints "an apple", without the leading space 

あなたは、例えば単純な代入、それらを引用する必要はありません。

a=$var 
a=$var$b 

割り当てがスペースやその他の特殊文字が含まれている場合は、引用する必要があり、これらの特殊文字をエスケープしてください:

a="$var $b" 
a=$var\ $b 
a=$var" "$b 

上記はすべて同じですが、最初の文字はおそらく読みやすく、したがってr推奨される。

あなたは、たとえば、危険な値を持つことはありません特別な変数を引用する必要はありません。

test $? = 0 

不明、またはまだ確信している場合、親指の良い役割は二重引用符にあり常に。

関連する問題