8

我尝试在 bash中减去dot( ) 之前的第一个字符串。.

例如:

1.2.3 -> 1
11.4.1 -> 11

我根据文档使用了以下命令:

s=4.5.0
echo "${s%.*}"

但它输出4.5而不是4. 我不明白。

这是为什么?

4

2 回答 2

20

您需要使用从末尾%%删除最长的匹配:

$ echo "${s%%.*}"
4

文档

${parameter%%word}
删除最大后缀模式。这个应该被扩展以产生一个模式。然后参数扩展将产生参数,其中与模式匹配的后缀的最大部分被删除。

于 2016-11-22T09:41:51.840 回答
2

您还可以使用tilde( ) 运算符,使用最新版本的 shell (since ) 中内置的bash 正则表达式功能。bash 3.0=~

$ string="s=4.5.0"
$ [[ $string =~ =([[:alnum:]]+).(.*) ]] && printf "%s\n" "${BASH_REMATCH[1]}"
4
$ string="s=32.5.0"
$ [[ $string =~ =([[:alnum:]]+).(.*) ]] && printf "%s\n" "${BASH_REMATCH[1]}"
32
于 2016-11-22T09:52:38.990 回答