Alpine 的 `sh` 中 if 块中的模式匹配

Alpine 的 `sh` 中 if 块中的模式匹配

如何复制以下 bash 表达式:

if [[ "$foo" =~ (bar|spam) ]]; then
  echo "True"
fi

在阿尔卑斯的/bin/sh

按原样输入会引发错误:

/bin/sh: syntax error: unexpected "(" (expecting "then")

答案1

如果您想测试您的 shell 变量是否foo包含子字符串barspam,那么您可以使用标准case ... esac语句来执行此操作。

case $foo in
    *bar*|*spam*) echo True
esac

如果您想要一个“包罗万象”的情况,请在末尾使用带有模式的单独情况*

case $foo in
    *bar*|*spam*) echo True ;;
    *) echo False
esac

请注意,使用的模式case ... esac是 shell 通配模式,而不是正则表达式。因此,模式需要匹配整个字符串,因此我们*在每个子字符串周围使用以允许两侧有其他字符。语句中的每个 case 都case ... esac使用一个|分隔的模式列表和一个在该列表中的模式匹配时执行的语句列表。案例的语句终止于;;(对于最后一个案例,您可以省略此)。 shell 使用匹配的模式执行第一种情况的代码。

您还可以将上面的第二个代码块编写为

case $foo in (*bar*|*spam*) echo True ;; (*) echo False; esac

模式的左括号始终是可选的。

答案2

有人不和谐帮我解决了这个问题。

可以使用以下语句复制问题中的片段case

case "$foo" in
(bar|spam) echo "True";;
esac

答案3

您可以使用:

#!/bin/sh
if [ "$foo" = bar ] || [ "$foo" = spam ]; then
  echo "True"
fi

相关内容