鉴于此 Bash 代码:
TEMP="1_2"
echo ${TEMP/_.*/}
为什么它打印出来1_2
而不是1
?
我也试过这些,但它们不起作用:
echo ${TEMP/_\.*/}
echo ${TEMP/_\\.*/}
这确实有效:
echo ${TEMP/_[0-9]*/}
但我想知道:
- 为什么句号不充当通配符?
- 我应该改用什么?
问号是单字符通配符。但是,它不像星号是量词的正则表达式那样工作。在 Bash 中,在参数扩展中,星号是多字符通配符。
$ temp=1_2
$ echo "${temp/_*}"
1
以下也适用于这种特殊情况。有关差异的更多信息,请参阅参数扩展。man bash
echo "${temp%_*}"
echo "${temp%%_*}"
我建议不要使用全部大写的变量名称,以减少名称与 shell 或环境变量发生冲突的机会。