我试图使用${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)
您需要以带有括号或空格的破折号"转义"参数,否则bash会将其视为普通字符串:
echo ${STRING:(-4)}
echo ${STRING: -4}
Run Code Online (Sandbox Code Playgroud)