当我在bash命令行中键入此命令时
$ x=hi; printf '%s ' "$x" "${x[0]}"; echo "${_[0]}"
我有这个输出:
hi hi hi
"${_[0]}"
原来"hi"
在输出中?"x[0]"
既然"x"
只是astring
而不是a ,为什么还要使用语法array
呢?该_
参数根据上下文具有多种含义,但它绝不是数组。同样,在您的示例中,x
不是数组。之所以能够将其视为数组,是因为Bash允许将非数组变量视为一元数组。Bash同样允许将数组变量视为非数组,从而赋予第一个元素。
如上man bash
所说:
引用不带下标的数组变量等效于引用带下标0的数组。使用有效下标对变量的任何引用都是合法的,并且
bash
会在必要时创建一个数组。
因此,"${_[0]}"
其行为与"${_}"
或相同"$_"
,因为_
它不是数组。同样,由于不是数组,"${x[0]}"
其行为与"${x}"
或相同。"$x"
x
至于为什么_
保留该值hi
:在您显示的用法中,对特殊参数执行参数扩展将_
生成最新(同步执行)命令的最后一个参数。
如man bash
所述_
:
在shell启动时,设置为用于调用环境或参数列表中传递的正在执行的shell或shell脚本的绝对路径名。随后,在扩展后,扩展到在前台执行的上一个简单命令的最后一个参数。还设置为用于调用每个执行的命令的完整路径名,并将其放置在导出到该命令的环境中。检查邮件时,此参数保存当前正在检查的邮件文件的名称。
(强调我的)
在这种情况下,最近执行的命令是:
printf '%s ' "$x" "${x[0]}"
传递给的参数printf
为:
%s
,仅对其执行了引号删除。hi
,对其执行参数扩展,然后删除引号。hi
,然后执行更复杂形式的参数扩展以产生相同的结果,然后删除引号。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句