首页 > 解决方案 > 匹配 master 和 release 的正确正则表达式是什么?

问题描述

我必须根据分支名称使用不同的键。如果分支名称以 release/master 开头,则需要使用 prod 键。但是这个正则表达式似乎在这个 shell 脚本中不起作用。

echo copying firebase keys based on the branch name
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
mkdir firebase
chmod 777 firebase
release="^(master$|release\/\S+)"
if [[ $branch == $release ]];
then cp  $(pwd)/firebase_keys/prod/*  $(pwd)/firebase;
  echo "prod firebase keys used"
else cp  $(pwd)/firebase_keys/dev/*  $(pwd)/firebase;
  echo "dev firebase keys used"
fi

标签: bashshell

解决方案


不使用 Bashisms:

if [ -n "$branch" ] && ! {
    [ "$branch" = "${branch#master}" ] &&
    [ "$branch" = "${branch#release}" ]
  }
then
  cp -- "$PWD/firebase_keys/prod/"* "$PWD/firebase"
  echo "prod firebase keys used"
else
  cp -- "$PWD/firebase_keys/dev/"* "$PWD/firebase"
  echo "dev firebase keys used"
fi

这个怎么运作:

"${branch#master}"masterbranch变量中删除前导词。

假设分支是masterpiece

  • "${branch#master}"master将从masterpiece→中删除前导piece

比较将[ "$branch" = "${branch#master}" ]转换为[ "masterpiece" = "piece" ]哪个是错误的,因此它确认以 .masterpiece开头master

所以:

  • [ -n "$branch" ]: 如果分支名称不为空
  • && !: 并不是
  • {: 为 NOT 条件语句打开分组
  • [ "$branch" = "${branch#master}" ]: 分支名称不以 . 开头master
  • &&: 和
  • [ "$branch" = "${branch#release}" ]: 分支名称不以 . 开头release
  • }: 关闭语句组

推荐阅读