オペレーティングシステム: Ubuntu 16.04.3
シェル:クンクン4.3.48
私はに示されているように変数の内容を一時的に変更することが可能であることを知っていますvar=value command
。IFS= read -r var
そして、Wikiを提供してくれたGregに感謝します。、私も次のことを理解しました。
# Why this
foo() { echo "$var"; }
var=value foo
# And this does work
var=value; echo "$var"
# But this doesn't
var=value echo "$var"
私が理解できないのは:
$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)
私が知っている限り(そして前の例のロジックによると)代わりにbar
印刷する必要があります(bar baz)
。
このようなことが私にのみ起こるのでしょうか?これが予想される動作ですか?私が逃したものは何ですか?それともバグですか?
ベストアンサー1
一般通貨:
var=value cmd
cmd
移植不可能な機能です。
の場合、bash
これはスカラー変数に対してのみ機能します(配列x=(...)
として検証されますが、スカラーに割り当てられます)。これには、スコープに関連する多くの問題があります。ksh93
とのyash
場合は機能しますが、変数定義はそのまま残ります。を使用するとmksh
構文エラーが発生します。 Bourneシェルでは、スカラー変数に対してもまったく機能しません。
また、スカラー変数を使用しても、変数は最終的に出口関数内(つまり、実行中のコマンドに渡される)はシェルによって異なります(bash、yash、mksh、zshでは異なりますが、ksh、ashではありません)。
それはあなたが期待する方法でのみ動作しますzsh
。配列インデックスはzsh
1から始まります。
bash-4.4$ zsh
$ a=(before value)
$ f() echo $a[1]
$ a=(temp value) f
temp
$ echo $a[1]
before