Regex 如何在破折号中比较字符串?

Regex 如何在破折号中比较字符串?,regex,bash,dash-shell,Regex,Bash,Dash Shell,出于兼容性原因,我将bash脚本移动到dash。以下比较是否有POSIX/Dash替代方案 COMPARE_TO="^(lp:~?|https?://|svn://|svn\+ssh://|bzr://|bzr\+ssh://|git://|ssh://)" if [[ $COMPARE =~ $COMPARE_TO ]]; then echo "WE ARE COMPARED!" fi 你可以用一个箱子。它不使用正则表达式,但在globs中也没有那么长 case $compare

出于兼容性原因,我将bash脚本移动到dash。以下比较是否有POSIX/Dash替代方案

COMPARE_TO="^(lp:~?|https?://|svn://|svn\+ssh://|bzr://|bzr\+ssh://|git://|ssh://)"

if [[ $COMPARE =~ $COMPARE_TO ]]; then
    echo "WE ARE COMPARED!"
fi

你可以用一个箱子。它不使用正则表达式,但在globs中也没有那么长

case $compare in
    lp:*|http://*|https://*|svn://*|svn+ssh://*|bzr://*|bzr+ssh://*|git:/*|ssh://*)
        echo "We are compared"
    ;;
esac

另一方面,您应该避免覆盖特殊的shell变量或环境变量。

dash没有内置regex比较,但您始终可以使用grep:

if echo "$compare" | egrep -q "$compare_to"; then
    ...

(注意,我支持@geirha关于shell中大写变量的注释。)

echo
在这种情况下总是有点可怕。<代码>案例答案更习惯和优雅,完全解决了这个问题,没有外部过程。@ TrPielee:我认为 Case语句的语法高度不雅,但我同意它更习惯和节省子过程。(前提是您可以将模式表示为glob而不是regex,并且在这种特殊情况下您可以)。顺便说一句,如果您担心echo,请使用
printf“%s\n”“$compare”