操作系统:Ubuntu 16.04.3
外壳:重击 4.3.48
我知道可以临时更改变量的内容,例如var=value command
,这可能IFS= read -r var
是最值得注意的情况。
而且,感谢 Greg 的 wiki,我也明白:
# 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)
.
这只发生在我身上吗?这是预期的行为,我错过了什么吗?或者这是一个错误?
一般叫法:
函数在哪里
cmd
是不可移植的。使用
bash
, 仅适用于标量变量(x=(...)
解析为数组但分配为标量),如果这样做,范围界定会出现许多问题,使用ksh93
andyash
,它可以工作,但变量定义在之后仍然存在。使用mksh
,您会收到语法错误。在 Bourne shell 中,它根本不起作用,即使对于标量变量也是如此。另请注意,即使使用标量变量,变量是否最终在函数中导出(即传递给正在执行的命令)因 shell 而异(它在 bash、yash、mksh、zsh 中,但在 ksh 中没有,灰)。
它只能以您期望的方式工作
zsh
。请注意,zsh
数组索引从 1 开始。这不仅仅是一个错误,它似乎是一个未实现的功能,没有任何计划。这个2014 年的邮件列表帖子来自创建者:
从 Bash 的最新 git repo 中提取
variables.c
:暗示有什么都不完整。
从
man bash
的 BUGS 部分(版本bash
是 4.3):下一个代码演示了一个临时变量存在于环境中,仅在函数运行时。函数完成后,临时变量消失。
相关信息:
VAR=VALUE some-command
施工。