Bash 匹配字符串中几个可能的字符之一

Bash 匹配字符串中几个可能的字符之一,bash,scripting,Bash,Scripting,在bash(3.2.48版)脚本中,我得到一个字符串,可以是: “XY” “Y” “YY” 等 因此,我有一个字母字符或一个空格(第一个槽),然后是相关字符(第二个槽)。我尝试了一些变化(没有grep、sed等),比如: 如果[[$string=~([:space]]{1}|[:alpha:]{1})M]];然后 及 如果[[$string=~(\s{1}|.{1})M]];然后 但我的解决方案并不总是正确工作(正确匹配每个组合) 或者(如果您想使用模式) 或者(更简单) 这应该适合您: if

在bash(3.2.48版)脚本中,我得到一个字符串,可以是:

“XY”
“Y”
“YY”

因此,我有一个字母字符或一个空格(第一个槽),然后是相关字符(第二个槽)。我尝试了一些变化(没有grep、sed等),比如:

如果[[$string=~([:space]]{1}|[:alpha:]{1})M]];然后

如果[[$string=~(\s{1}|.{1})M]];然后

但我的解决方案并不总是正确工作(正确匹配每个组合)

或者(如果您想使用模式)

或者(更简单)


这应该适合您:

if [[ $string =~ [[:space:][:alpha:]]M ]]; then

如果不使用正则表达式,简单的模式匹配就足够了:

if [[ $string == [[::upper:]\ ]M ]]; then
  echo match
fi

根据您的示例,您想要的是
[[:upper:][]
,而不仅仅是
[[:alpha:][]

,请更好地解释您需要什么。是否要测试字符串是否具有特定格式(如果有,是哪种格式)?是否要从字符串中提取“相关字符”?还有什么?显示示例-失败的匹配。我需要匹配
git状态--
输出。可以是‘A’、‘AD’、‘MM’、‘AM’、‘M’等。我对以‘M’作为第二个字符的情况很感兴趣。因此规则是“要么有空格,要么有字符”,然后“在末尾有一个字符”“.你想得到最后一个字符吗?对。@patrix解决方案似乎达到了预期的效果,谢谢。我还添加了一个带有模式的版本。如果您的问题得到解决,请接受我对3.2.48的回答,您是重新键入还是使用复制/粘贴?尝试键入和粘贴。唯一有效的版本是
${string:1:1}==“M”
one…奇怪。也许bash的一些选择与我的不同。可能是Shopt内置的吗?有一种方法可以为脚本启用选项吗?谢谢,但这一个有我以前发现的相同问题:不捕捉“MM”。我不知道原因。@Max:我道歉。我省略了一个冒号(你也省略了)。请看我修改后的答案。你完全正确,我的代码中忘记了冒号,谢谢。奇怪的部分是:在我的bash中工作的唯一版本是@patrix的(第一个)版本:
if[${string:1:1}==“M”];然后
谢谢你@glenn jackman:说得好。不幸的是,即使这一个在我的bash中也不起作用。唯一给出确切结果的解决方案是
${string:1:1}==“M”
。我想我缺少了一些东西。。。
if [[ $string == ?M ]]; then
    echo Heureka
fi
if [[ $string =~ [[:space:][:alpha:]]M ]]; then
if [[ $string == [[::upper:]\ ]M ]]; then
  echo match
fi