Je dois utiliser différentes clés en fonction du nom de la branche. Si le nom de la branche commence par release / master, vous devez utiliser les clés prod. Mais cette expression régulière ne semble pas fonctionner dans ce script 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
0
rohitwtbs 27 août 2020 à 16:28

3 réponses

Meilleure réponse

Il existe un opérateur =~ pour l'expression rationnelle bash

re='^(master|release)'
if [[ $branch =~ $re ]];
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

Mise à jour

re='^(master|release)'
[[ $branch =~ $re ]] && dir=prod || dir=dev
echo "$dir firebase keys used"
cp firebase_keys/$dir/* firebase/

Essai

test=(
    'asd master dvsdfc'
    'asf release sdflk '
    'master asdcal asdlk'
    'release sdddsfdf'
    'asfsf sdsd master'
    'asfasf sdfsdfrelease'
)

re='^(master|release)'
for string in "${test[@]}"; {
    [[ $string =~ $re ]] && printf "$string\tprod\n" || printf "$string\tdev\n"
}

Production

asd master dvsdfc       dev
asf release sdflk       dev
master asdcal asdlk     prod
release sdddsfdf        prod
asfsf sdsd master       dev
asfasf sdfsdfrelease    dev

Sans regex

branch=${branch//master*}
branch=${branch//release*}
[[ $branch ]] && dir=dev || dir=prod
echo $dir
1
Ivan 27 août 2020 à 14:57

Votre regex a quelques problèmes. Premièrement, Bash ne prend pas en charge les extensions Perl comme \S. Deuxièmement, de manière inoffensive mais révélatrice, vous n'avez pas besoin d'échapper à la barre oblique, car la barre oblique n'a pas de signification particulière dans les expressions régulières. (Il existe des langages comme Awk qui utilisent des barres obliques comme séparateurs autour des expressions rationnelles; vous devez alors les échapper. Mais Bash n'est pas l'un de ces langages.)

Quoi qu'il en soit, surtout si vous n'êtes pas très à l'aise avec les regex, je refactoriserais pour utiliser une instruction case à la place. La syntaxe semblera étrangère au début si vous ne la connaissez pas déjà, mais je pense que vous constaterez qu'elle est en fait assez lisible, maintenable et polyvalente (ainsi que portable en basique sh).

case $(git branch | sed -n 's/^\* \(.*\)/\1/p') in
  master/* | release/* )
    env='prod';;
  * )
    env='dev';;
esac
cp  ./firebase_keys/"$env"/*  ./firebase
echo "$env firebase keys used"

Notez également que le répertoire de travail actuel est déjà le répertoire par défaut pour tous les chemins relatifs; il n'est pratiquement jamais nécessaire d'utiliser $(pwd) - ou, dans Bash, la variable intégrée plus économique $PWD - à moins que vous n'ayez spécifiquement besoin de forcer des chemins absolus. (Peut-être voir aussi Différence entre ./ et ~/)

1
tripleee 28 août 2020 à 15:06

Sans utiliser les bashismes:

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

Comment ça fonctionne:

"${branch#master}" supprime le mot principal master de la variable branch.

Disons que la branche est masterpiece:

  • "${branch#master}" supprimerait le premier master de masterpiecepiece

La comparaison [ "$branch" = "${branch#master}" ] se traduirait par [ "masterpiece" = "piece" ] qui est faux, donc elle confirme que masterpiece commence par master.

Donc:

  • [ -n "$branch" ]: si le nom de la branche n'est pas vide
  • && !: ET PAS
  • {: regroupement ouvert pour les instructions de condition NOT
  • [ "$branch" = "${branch#master}" ]: le nom de la branche ne commence pas par master.
  • &&: ET
  • [ "$branch" = "${branch#release}" ]: le nom de la branche ne commence pas par release.
  • }: ferme le groupe d'instructions
2
Léa Gris 27 août 2020 à 15:23