如何复制以下 bash 表达式:
if [[ "$foo" =~ (bar|spam) ]]; then
echo "True"
fi
在阿尔卑斯的/bin/sh
?
按原样输入会引发错误:
/bin/sh: syntax error: unexpected "(" (expecting "then")
答案1
如果您想测试您的 shell 变量是否foo
包含子字符串bar
或spam
,那么您可以使用标准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