2017-08-30 3 views
1

以下は、空の変数を一重引用符で置き換えたスクリプトです。変数が空でない場合、正しい置換があります。bashの空変数のコマンド置換により、一重引用符につながります。

$ set -x; aa=""; bb=`curl "$aa" -vvv`; set +x 
+ aa= 
++ curl '' -vvv 

注目すべきことは、空の変数の代わりに一重引用符です。

変数が空でない場合は、すべてが同様に正常に動作します:

$ set -x; aa="google.com"; bb=`curl "$aa" -vvv`; set +x 
+ aa=google.com 
++ curl google.com -vvv 

Q1:なぜ空の変数または導入された単一引用符が得られた空間を持つ変数はありますか? Q2:空の変数の代わりに一重引用符を使用しないようにするにはどうすればよいですか?

ここで二重引用符を削除できますが、すべて正常に機能しますが、スペースがあればそれを保存する必要があります。

ありがとうございました。

答えて

3

シングル引用符がされていませんあなたが空の引数を渡していることを示すために使用されています。二重引用符を使用すると、空の引数が渡されます。あなたは引数をしたいんが、変数に空白を許可したい場合は、あなたのような何かをする必要があります:

curl ${aa:+"$aa"} -vvv 

aaは空の文字列ですが、あなたの説明から、あなたが望む表示されたとき、これはcurl ${aa+"$aa"} -vvvとは異なっています前者。

+0

ありがとうございます。なぜカールは、空の引数または実際の引数を持つ空間を解釈するのだろうか?それを無視してはいけませんか?これはカールの問題かシェルの問題ですか? – Khanna111

+1

空の文字列を引数として渡すと、それが渡される引数になります。なぜカールはそれを無視する必要がありますか?これはシェルの問題でもカールの問題でもありません。それは使用エラーです。 curlに空の引数を渡していますが、curl(IMOは正しく)はその引数を特別な方法で扱いませんが、空の文字列をURLとして使用しようとします。 –

1

$aaの前後に二重引用符を使用したため、一重引用符が表示されるため、空の文字列がパラメータとして表示されます。あなたはこのような二重引用符をドロップする場合は、この効果を得ることはありません。

set -x; aa=""; bb=`curl $aa -vvv`; set +x 
+2

二重引用符をオフにすると、変数の値が単語の分割やワイルドカード展開の影響を受け、予期しない動作が発生する可能性があることにも注意してください。 –

0

あなたは二重引用符に変数置換を囲まれたためです。 $aaは、空の文字列に展開されます。空の文字列は引用符で囲まれているため、何も付いていない引用符が生成されます。この場合、curlは3つの引数をこの順番で表示します:curl<empty string>-vvv

あなたは$aaラウンド二重引用符を削除する場合は、2番目の引数はcurlに渡されませんに、それはそれでargvパラメータにのみcurl-vvvが表示されますが、main関数です:

$ set -x; aa=""; bb=`curl $aa -vvv`; set +x 
+ aa= 
++ curl -vvv 
関連する問題