在 shell 中执行代码还是在预期的子 shell 中执行代码之间存在这种差异?
$ a() { echo ${@: -1} ; }
$ echo "echo ${*: -1}" > b
$ chmod +x b
$ a 1 2 3
3
$ ./b 1 2 3
bash
$
Debian Sid
Bash 版本 5.2.15
在 shell 中执行代码还是在预期的子 shell 中执行代码之间存在这种差异?
$ a() { echo ${@: -1} ; }
$ echo "echo ${*: -1}" > b
$ chmod +x b
$ a 1 2 3
3
$ ./b 1 2 3
bash
$
Debian Sid
Bash 版本 5.2.15
这里:
这
"${*: -1}"
是双引号,所以它会立即展开。当切片符号与$*
or一起使用时,它会查看, , ...$@
的列表,而不仅仅是从 开始的位置参数列表。负索引从末尾开始倒数,因此从 at开始给出该列表的最后一个元素。$0
$1
$1
-1
由于您在交互式 shell 中可能没有位置参数,因此采用该列表的最后一个元素给出
$0
shell 名称。在您的情况下,这似乎是bash
,并且该文件b
将包含echo bash
.在函数中,
${@: -1}
看到函数本身的位置参数,最后一个是3
.如果要将字符串存储
echo ${*: -1}
在文件中,请改用单引号以防止扩展。最好还添加双引号,以便在扩展发生时引用它,例如不过这里没有子 shell,只有一个函数和一个外部脚本。