パラメータ拡張

パラメータ拡張

私はパラメータ拡張で遊んだ。以下は私のコードです。

a="one"
sh -c 'echo $a'

b="two"
sh -c "echo $b"

c="three" sh -c 'echo $c'
echo $c

このスクリプトを実行したときの出力は次のとおりです。

$sh test.sh

two
three

$

$aの場合、一重引用符は置換を抑制します。ちょうどecho $aを出力してはいけませんか?新しい行を印刷していますが、これは$aの値が空であることを意味しますか? $c の場合、「echo $c」は機能せず、新しい行は印刷されませんが、次の行の echo $c は期待どおりに動作します。これがどのように機能するのか少し混乱しています。

ベストアンサー1

sh -c 'echo $a'これは、新しいシェルを開いてecho $a入力するのと同じです。子シェルには変数がないためa(親シェルで変数を設定していないexport)、空白行が印刷されます。

そして

b="two"
sh -c "echo $b"

"echo $b"文字列は現在のシェルによって拡張され、拡張された値はパラメータ文字列としてサブシェルに渡されます。まるで新しいシェルを開きますecho two

var=val command一時的に設定してexportsをvar=val呼び出すだけですcommand

c="three" sh -c 'echo $c'

ほとんど(サブシェルは実際には存在しません)

( export c="three"; sh -c 'echo $c' )

親シェルのc変数は影響を受けません。

おすすめ記事