Créer un code script bash conditionnel

J’utilise le code suivant pour charger un fichier texte avec des emails et créer des utilisateurs dans le système avec un mot de passe utilisateur. le fichier texte contient des e-mails comme suit

[email protected] [email protected] [email protected] 

Si le nom vient avec les majuscules, je le convertis en minuscules, j’ai pu le faire fonctionner. Maintenant, je dois prendre en charge une autre entrée au lieu de l’email, par exemple

 P123456 Z877777 

mais maintenant je ne veux pas pour ce type d’entrée pour le convertir en minuscules

quelque chose comme

 if(emailpattern ) convert to lower else Not 

C’est le code qui fonctionne mais je n’ai pas réussi à le faire fonctionner …

 for user in $(cat ${users} | awk -F";" '{ print $1 }'); do user=$(echo ${user} | tr "[:upper:]" "[:lower:]") log "cf create-user ${user} ${passwd}" #Here we are creating email user in the sys cf create-user ${user} ${passwd} 2>&1 | tee -a ${dir}/${scriptname}.log || { log "ERROR cf create-user ${user} failed" ; errorcount=$[errorcount + 1]; } done 

Vous pouvez utiliser:

 while IFS= read -r user; do # convert to lowercase only when $user has @ character [[ $user == *@* ]] && user=$(tr "[:upper:]" "[:lower:]" <<< "$user") log "cf create-user ${user} ${passwd}" cf create-user ${user} ${passwd} 2>&1 | tee -a ${dir}/${scriptname}.log || { log "ERROR cf create-user ${user} failed" ; errorcount=$[errorcount + 1]; } done < <(awk -F ';' '{ print $1 }' "$users") 

Hypothèses:

  • le fichier d’entrée est constitué d’adresses électroniques ou de noms, chacun sur une ligne distincte
  • les adresses e-mail doivent être converties en minuscules
  • les noms doivent être laissés tels quels (c.-à-d. pas de conversion en minuscules)
  • toutes les fonctions log/cf/tee/errorcount fonctionnent comme vous le souhaitez

Exemple de fichier d’entrée:

 $ cat userlist [email protected] [email protected] [email protected] P123456 Z877777 

Nous allons commencer par utiliser awk pour convertir de manière conditionnelle les adresses électroniques en minuscules:

 $ awk '/@/ {$1=tolower($1)} 1' userlist [email protected] [email protected] [email protected] P123456 Z877777 
  • Nous allons d’abord exécuter le fichier d’entrée ( userlist ) via awk
  • /@/ : pour les lignes qui incluent une adresse e-mail (c.-à-d. contient @ ) …
  • $1=tolower($1) : convertit l’adresse e-mail (zone n ° 1) en minuscules, puis …
  • 1 : vrai pour tous les enregistrements et implique d’ print toutes les entrées en sortie

Conduisez maintenant la sortie awk vers une boucle while pour effectuer le rest des opérations:

 awk '/@/ {$1=tolower($1} 1}' userlist | while read user do log "cf create-user ${user} ${passwd}" #Here we are creating email user in the sys cf create-user ${user} ${passwd} 2>&1 | tee -a ${dir}/${scriptname}.log || { log "ERROR cf create-user ${user} failed" ; errorcount=$((errorcount + 1)) ; } done 
  • mis à jour pour incrémenter correctement errorcount de 1

bash peut texte en minuscule :

 while IFS= read -r line; do [[ $line == *@* ]] && line=${line,,} # do stuff with "$line" done