Shell脚本中的正则表达式比较

时间:2016-12-12 16:59:24

标签: xcode bash shell

在Xcode 8中,我有一个运行脚本,它将字符串与正则表达式进行比较:

if [ "$MOBILE_BUNDLE_IDENTIFIER" =~ ".+(Debug)" ]
then
RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Debug
elif [ "$MOBILE_BUNDLE_IDENTIFIER" =~ ".+(Test)" ]
then
RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Production
elif [ "$MOBILE_BUNDLE_IDENTIFIER" =~ ".+(ProductionTest)" ]
then
RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Test
else
RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Store
fi

变量$MOBILE_BUNDLE_IDENTIFIER将是以下之一:

com.cnt.Filer
com.cnt.Filer.ProductionTest
com.cnt.Filer.Debug
com.cnt.Filer.Test

当我运行时,我收到以下错误:

line 4: [: =~: binary operator expected
line 7: [: =~: binary operator expected
line 10: [: =~: binary operator expected

在完整的脚本行中,第4,7和10行是then语句。

有谁知道我如何成功地将我的变量与正则表达式进行比较?

1 个答案:

答案 0 :(得分:5)

  1. 您应该在BASH
  2. 中使用[[ string =~ regex ]]作为正则表达式
  3. 不引用正则表达式
  4. 看起来你甚至不需要正则表达式,你可以使用==进行字符串比较
  5. 您的脚本可以是:

    if [[ $MOBILE_BUNDLE_IDENTIFIER == *Debug* ]]; then
       RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Debug
    elif [[ $MOBILE_BUNDLE_IDENTIFIER == *Test* ]]; then
       RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Production
    elif [[ $MOBILE_BUNDLE_IDENTIFIER == *ProductionTest* ]]; then
       RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Test
    else
       RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Store
    fi
    

    PS:您也可以考虑使用case

    case "$MOBILE_BUNDLE_IDENTIFIER" in
    *Debug*)
       RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Debug
       ;;
    *Test*)
       RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Production
       ;;
    *ProductionTest*)
       RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Test
       ;;
    *)
       RESOURCE_PATH=${SRCROOT}/Resources/Clients/Cnt/Files/Store
       ;;
    esac