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

时间:2015-07-17 13:09:28

标签: 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"

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

2 个答案:

答案 0 :(得分:18)

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

来自documentation

  

当不执行子串扩展时,使用所描述的表单   在下面(例如,': - '),Bash测试未设置的参数或   空。

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

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

  

请注意,负偏移量必须与冒号分隔为   至少一个空间,以避免与: - 扩展混淆。

例如:

${STRING:(-4)}
${STRING: -4}

答案 1 :(得分:9)

你需要"逃避"以带括号或空格的短划线开头的参数,否则bash会将其视为普通字符串:

echo ${STRING:(-4)}
echo ${STRING: -4}