我试图使用${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"
?
答案 0 :(得分:18)
因为:-
是"参数扩展语法,使用默认值"。
当不执行子串扩展时,使用所描述的表单 在下面(例如,': - '),Bash测试未设置的参数或 空。
所以通过${STRING:-4}
你实际上要求bash扩展
STRING
如果未设置(之前从未分配过)或null
(一个空字符串,打印为''
)它将替换扩展
4
。在您的示例中,STRING
已设置,因此会扩展为其值。
正如另一个答案所述,你需要将表达式视为不 触发默认值行为,手册指定它:
请注意,负偏移量必须与冒号分隔为 至少一个空间,以避免与: - 扩展混淆。
例如:
${STRING:(-4)}
${STRING: -4}
答案 1 :(得分:9)
你需要"逃避"以带括号或空格的短划线开头的参数,否则bash会将其视为普通字符串:
echo ${STRING:(-4)}
echo ${STRING: -4}