2016-08-27 8 views
1

私はbashで見積もっています。 私はコード引用符で囲まれた変数展開の引用符がbashでうまく動作するのはなぜですか?

unset unset_var 
test_var="${unset_var:-"abc"}" 
echo "test_var = $test_var" 
tset_var = abc 

私の質問は、ラインから来て、 "$ {unset_var: - " 得た私は二つの方法、

最初の方法で行をinterupted ABC "}"

をされます

"${unset_var:-"abc"}" = 
(quoted string: "${unset_var:-") + 
(unquoted string: abc) + 
(quoted string: "}") 

第二の方法は、

"${unset_var:-"abc"}" = 
("${}") + (abc:-"abc") 
です

最初の方法は私には直感的です。

第二の方法は、

"$(command "aug")" # quote in sub-shell is independent from one in parent-shell 

のように私はbashのマニュアルにこの質問の指示を見つけることができなかった、親シェルからサブシェルで独立の引用に似ています。

どのように動作するのかわかっている方は、教えてください。ありがとうございました。フォーム

name=value 

valueの任意の代入文で

答えて

2

valueに適用される拡張の結果ではない任意の引用符の除去で引用除去を受けます。パラメータ展開の周り

test_var="${unset_var:-"abc"}" 

引用符で

は明らかに任意の拡張の結果ではないので、それらは削除されます。問題は、内部引用符がどのように扱われるかです。マニュアルページによれば

[${parameter:-word}]において、wordはチルダ展開、パラメータ展開、コマンド置換、および算術展開の対象である。」

しかし、​​がないので4つの指定された拡張のいずれも受けていない場合、周囲の引用符は展開の積ではなく、引用符の削除ごとに削除されるため、

test_var="${unset_var:-"abc"}" 

test_var=abc 
+0

と同等です

test_var="${unset_var:-abc}" 

に相当し、美しい説明いただきありがとうございます。一つのことを私に確認させてください。 test_var = "$ {unset_var: - " abc "}" - > test_var = "abc"上記の割り当て時に見積の削除が適用されます。その結果、test_var = abcです。それが正しいか? test_var = "$ {unset_var: - " abc "}"という形式は、form、name = valueと少し異なります。私は些細なことを尋ねているのではないかと心配していますが、二重引用符の削除の仕組みが最初の削除と全く同じかどうかは100%確信できませんでした。ありがとうございました。 – mora

+0

おそらく、割り当て時に、右側の文字列に引用符の削除などの拡張処理が行われている可能性があります。 test_var = "$ {unset_var: - " abc "}"の場合、同じ展開プロセスがその場所の "abc"に適用されます。だから、test_var = "$ {unset_var:-abc}"が正しいかもしれませんし、test_var = "abc"が間違っているかもしれません。 – mora

関連する問題