【问题标题】:How to regex compare a string in dash?如何正则表达式比较破折号中的字符串?
【发布时间】:2012-08-23 07:29:49
【问题描述】:

出于兼容性原因,我将 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

【问题讨论】:

    标签: regex bash dash-shell


    【解决方案1】:

    您可以使用案例。它不使用正则表达式,但使用 glob 并没有那么长

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

    附带说明,您应该avoid using all uppercase variable names,因为您可能会覆盖特殊的 shell 变量或环境变量。

    【讨论】:

      【解决方案2】:

      dash 没有内置正则表达式比较,但您始终可以使用 grep:

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

      (请注意,我是第二个@geirha 关于shell 中大写变量的注释。)

      【讨论】:

      • echo 在这种情况下总是有点吓人。 case 的答案更加地道和优雅,完全无需外部流程即可解决问题。
      • @tripleee:我认为case 语句的语法非常不优雅,但我同意它更惯用并且可以节省子流程(前提是您可以将您的模式表达为一个 glob 而不是正则表达式,并且您可以在这种特殊情况)。顺便说一句,如果您担心回声,请改用printf "%s\n" "$compare"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多