次のコマンドと同様に、
if true; then
IFS=":" read a b c d e f <<< "$test"
本は、割り当てコマンド(IFS ":"
)がメインコマンド()の前に使用される場合、read a b c d e f <<< "$value"
その値が一時的にメインコマンドに有効であることを示しています。したがって、read
コマンドは区切り文字を使用します:
。
しかし、このコマンドのように
if true; then
HOME="hello" echo "$HOME"
エコメッセージはhelloではありません。上記のコマンドは実際に何を意味しますか?
ベストアンサー1
評価がどのように行われるかという問題で帰結します。どちらの例も同じ方法で動作しますが、シェル(ここではbash)が変数を拡張する方法が原因で問題が発生します。
このコマンドを書くとき:
HOME="foo" echo $HOME
$HOME
拡張コマンドが実行される前。したがって、コマンドに設定した新しい値ではなく元の値に展開されます。変数はHOME
コマンドが実行される環境で変更されますが、親変数から変数を印刷します。echo
$HOME
これを説明するために、次の状況を考慮してください。
$ HOME="foo" bash -c 'echo $HOME'
foo
$ echo $HOME
/home/terdon
上記のように、最初のコマンドは一時的に変更された値を印刷し、2番目のコマンドは元の値を印刷し、変数が一時的にのみ変更さHOME
れたことを示します。コマンドは二重引用符()ではなく一重引用符()で囲まれているため、bash -c ...
変数は拡張されずに変更されずに新しいbashプロセスに渡されます。その後、この新しいプロセスはそれを展開し、設定された新しい値を印刷します。次のコマンドを使用すると、これが起こっていることがわかります。' '
" "
set -x
$ set -x
$ HOME="hello" echo "$HOME"
+ HOME=hello
+ echo /home/terdon
/home/terdon
上からわかるように、変える $HOME
に渡されませんecho
。拡張子の値のみを表示できます。比較:
$ HOME="hello" bash -c 'echo $HOME'
+ HOME=hello
+ bash -c 'echo $HOME'
hello
ここでは、一重引用符のため、変数はその値の代わりに新しいプロセスに渡されます。