在 shell 或子 shell 中执行代码之间出现意外差异

在 shell 或子 shell 中执行代码之间出现意外差异

在 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 中可能没有位置参数,因此采用该列表的最后一个元素给出$0shell 名称。在您的情况下,这似乎是bash,并且该文件b将包含echo bash.

在函数中,${@: -1}看到函数本身的位置参数,其中最后一个是3

如果要将字符串存储echo ${*: -1}在文件中,请使用单引号来防止扩展。最好还添加双引号,以便在发生扩展时引用它,例如

echo 'echo "${*: -1}"' > c

不过,这里没有子 shell,只有一个函数和一个外部脚本。

相关内容