私はパラメータ拡張で遊んだ。以下は私のコードです。
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
一時的に設定してexport
sをvar=val
呼び出すだけですcommand
。
c="three" sh -c 'echo $c'
ほとんど(サブシェルは実際には存在しません)
( export c="three"; sh -c 'echo $c' )
親シェルのc変数は影響を受けません。