2

鉴于此 Bash 代码:

TEMP="1_2"
echo ${TEMP/_.*/}

为什么它打印出来1_2而不是1

我也试过这些,但它们不起作用:

echo ${TEMP/_\.*/}
echo ${TEMP/_\\.*/}

这确实有效:

echo ${TEMP/_[0-9]*/}

但我想知道:

  1. 为什么句号不充当通配符?
  2. 我应该改用什么?
4

1 回答 1

5

问号是单字符通配符。但是,它不像星号是量词的正则表达式那样工作。在 Bash 中,在参数扩展中,星号是多字符通配符。

$ temp=1_2
$ echo "${temp/_*}"
1

以下也适用于这种特殊情况。有关差异的更多信息,请参阅参数扩展。man bash

echo "${temp%_*}"
echo "${temp%%_*}"

我建议不要使用全部大写的变量名称,以减少名称与 shell 或环境变量发生冲突的机会。

于 2012-06-04T04:50:21.250 回答