在 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
这里:
$ echo "echo ${*: -1}" > b
这"${*: -1}"
是双引号引起来的,所以它会立即扩展。当切片表示法与$*
or一起使用时,它会查看, , ...$@
的列表,而不仅仅是从 开始的位置参数列表。负索引从末尾倒数,因此从 at 开始给出该列表的最后一个元素。$0
$1
$1
-1
由于交互式 shell 中可能没有位置参数,因此采用该列表的最后一个元素给出$0
shell 名称。在您的情况下,这似乎是bash
,并且该文件b
将包含echo bash
.
在函数中,${@: -1}
看到函数本身的位置参数,其中最后一个是3
。
如果要将字符串存储echo ${*: -1}
在文件中,请使用单引号来防止扩展。最好还添加双引号,以便在发生扩展时引用它,例如
echo 'echo "${*: -1}"' > c
不过,这里没有子 shell,只有一个函数和一个外部脚本。