如何使用负偏移量在bash中使用字符串的后缀?

qnt*_*ntm 13 bash shell

我试图使用${string:pos}子串语法在Bash中获取字符串的后缀,但我无法弄清楚为什么它不起作用.我设法将我的示例代码简化为:

STRING="hello world"

POS=4
echo ${STRING:POS} # prints "o world"
echo ${STRING:4}   # prints "o world"

POS=-4
echo ${STRING:POS} # prints "orld"
echo ${STRING:-4}  # prints "hello world"
Run Code Online (Sandbox Code Playgroud)

前三行完全按照我的预期工作,但为什么最后一行打印"hello world"而不是"orld"

jvd*_*vdm 19

因为:-参数扩展语法为"使用默认值".

文档:

当不执行子串扩展时,使用下面描述的形式(例如,': - '),Bash测试未设置或为null的参数.

所以通过这样做${STRING:-4}你实际上是要求bash扩展 STRING,如果它未设置(之前从未被分配)或null(空字符串,打印为''),它将替换扩展 4.在您的示例中,STRING已设置,因此它将扩展为其值.

正如另一个答案所述,您需要将表达式调整为不触发默认值行为,手册指定它:

请注意,负偏移量必须与冒号分隔至少一个空格,以避免与以下内容混淆: - 扩展.

例如:

${STRING:(-4)}
${STRING: -4}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,这是令人愉快的暧昧. (2认同)

cis*_*eat 9

您需要以带有括号或空格的破折号"转义"参数,否则bash会将其视为普通字符串:

echo ${STRING:(-4)}
echo ${STRING: -4}
Run Code Online (Sandbox Code Playgroud)