bash:为什么$ {@: - 1}的值与$ {@:-1}不同?

Tom*_*ale 3 arrays bash

为什么在:和之间添加空格会-1改变下面显示的行为?

(ins)$ set a b c d
(ins)$ echo ${@:-1}
a b c d
(ins)$ echo ${@: -1}
d
(ins)$
Run Code Online (Sandbox Code Playgroud)

同样的行为也会影响$*.

我跑GNU bash, version 4.4.5(1)-release (x86_64-unknown-linux-gnu).

hee*_*ayl 5

为避免参数扩展模式的模糊:

${parameter:-word}
Run Code Online (Sandbox Code Playgroud)

这意味着替换wordif参数的扩展是unset或null; 否则参数的扩展被替换.

因此,对于切片操作,使用空格或括号:

$ set a b c d

$ echo "${@: -1}"
d

$ echo "${@:(-1)}"
d
Run Code Online (Sandbox Code Playgroud)