2017-09-06 1 views
1

Ich verwende den folgenden Code, um eine Textdatei mit E-Mails zu laden und Benutzer im System mit Benutzerkennwort zu erstellen. die Textdatei E-Mails enthalten wie folgtCode für bedingten Bash-Skript erstellen

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

Falls der Name mit Großbuchstaben kommen ich es Bekehrtfall zu senken, konnte ich es funktioniert. Jetzt muss ich eine andere Eingabe anstelle von E-Mail z.

P123456 
Z877777 

aber jetzt nicht, dass ich für diese Art von Eingabe will es Fall

some wie

if(emailpattern) 
    convert to lower 
else 
    Not 

Dies ist der Code zu senken wandeln, das funktioniert, aber ich nicht, damit es funktioniert. ..

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 
+0

Ein paar Dinge nicht klar (für mich) ... Sie haben eine Mischung aus E-Mail-Adressen und Namen (zB 'P123456') in der gleichen Datei? Was ist der Wert von $ {users} 'in Ihrem Beispielcode? Woher kommt '$ {password}'? Was sind die eigentlichen (bash) Befehle, die Sie für die verschiedenen Arten von Eingabedaten generieren möchten? – markp

+0

@markp - Es kann gemischt werden, aber kann nur E-Mail oder einfach nur sein ..., Benutzer ist der Inhalt der Datei, Passwort ist eine Konstante –

+0

@John, beachten Sie bitte, dass '$ {user}' ist sehr verschieden von ' "$ user" '- [Sie möchten die letztere Syntax verwenden] (https://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash -posix-shells) –

Antwort

1

Sie verwenden können:

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") 
+0

Danke, ich habe es ausprobiert und ich habe Fehler 'awk: Datei-Benutzer nicht öffnen können ', keine Ahnung? –

+0

Versuchen Sie es jetzt. Sorry Dateiname sollte sein: '" $ users "' – anubhava

1

Annahmen:

  • Eingabedatei besteht aus E-Mail-Adressen oder Namen, die jeweils auf einer separaten Zeile
  • E-Mail-Adressen sind Fall
  • Namen wie gelassen werden sollen, niedriger sein umgewandelt (dh keine Umwandlung in Kleinbuchstaben)
  • alle der log/cf/tee/errorcount Codefunktionen beliebig

Beispieleingabedatei:

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

Wir mithilfe von awk bedingt beginnen werde, um E-Mail-Adressen Bekehrtfall senken:

$ awk '/@/ {$1=tolower($1)} 1' userlist 
[email protected] 
[email protected] 
[email protected] 
P123456 
Z877777 
  • zuerst werden wir die Eingabedatei (userlist) durch awk laufen ...
  • /@/: für Zeilen, die eine E-Mail-Adresse enthalten (dh enthält @) ...
  • $1=tolower($1): konvertieren Sie die E-Mail-Adresse (Feld # 1) in Kleinbuchstaben, dann ...
  • 1: true für alle Datensätze und impliziert print alle Eingänge zur Ausgabe

Nun Rohr die awk Ausgang an einen while Schleife den Rest der Vorgänge auszuführen:

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 
  • aktualisierenden Errorcount korrekt um 1
1

bash can lower-case text:

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