2016-05-26 15 views
0

Ich erstelle ein Shell-Skript zum Lesen des Benutzers und Projektnamen aus .csv-Datei und fügen Sie den Benutzer ist config.xml-Datei.Lesen von .csv-Datei mit Shell-Skript breaking bedingte Schleife Logik

enter image description here

Unten finden Sie die XML-Beispieldatei

<?xml version='1.0' encoding='UTF-8'?> 
<hudson> 
<authorizationStrategy> 
<roleMap type="globalRoles"> 
    <role name="Employee" pattern=".*"> 
    <assignedSIDs> 
     <sid>abc</sid> 
     <sid>cde</sid> 
     <sid>user1</sid> 
    </assignedSIDs> 
    </role> 
</roleMap> 

<roleMap type="projectRoles"> 
    <role name="project_a"> 
<permissions/> 
    <assignedSIDs> 
     <sid>abc</sid> 
     <sid>cde</sid> 
     <sid>user1</sid> 
    </assignedSIDs> 
    </role> 
<role name="project_b"> 
<permissions/> 
    <assignedSIDs> 
     <sid>abc</sid> 
     <sid>cde</sid> 
    </assignedSIDs> 
    </role> 
</roleMap> 
</authorizationStrategy> 
</hudson> 

Im Folgenden wird der Code-Schnipsel

while IFS=',' read -r user projectName; 
    do 
     echo "start" 
     echo "userid is : $user" 
     echo "projectRoles is: $projectName" 

    #check if user is present in global role 
    a=$(xmlstarlet sel -t -v "/hudson/authorizationStrategy/roleMap[@type='globalRoles']/role[@name='Employee']/assignedSIDs/sid = '$user'" config.xml) 
    b=true 
    c=$(xmlstarlet sel -t -v "/hudson/authorizationStrategy/roleMap[@type='projectRoles']/role[@name='$projectName']/assignedSIDs/sid='$user'" config.xml) 
    d=true 

    if [ $a -eq $b ]; 
    then 
     echo " $user is present in global roles" 
     #Check if the user is present in project role 

     if [ $c -eq $d ]; 
     then 
      echo " Cannot add $user, as it is already present in $projectName " 
     else 
      echo "$user has been added to project" 
      echo " To step out of the script, press CTRL + c key " 
     fi   
    else 
     echo " $user is not present in global roles" 
    fi 
sleep 3; 
done <addExcelUser.csv 

Fragen, die ich bin vor: 1) die Variable "c" ausgegeben false, wenn ich es innerhalb der while-Schleife verwende, aber wenn ich es verwende, ohne den Befehl zu verwenden, um die .csv-Datei zu lesen, zeigt es "true". deswegen geht meine ganze Logik schief.

für zB: user1 ist in der globalen Rolle und in project_a vorhanden, also zeigt die Variable "a" den Wert true, und wenn sie mit der Variablen b in if Ausdruck verglichen wird, ergibt sie true. aber Variable c zeigt false, auch wenn der Benutzer1 in dieser Projektrolle (project_a) vorhanden ist. Idealerweise sollte es stimmen.

Meine Vermutung ist das irgendwo die Schleife bricht beim Lesen .csv-Datei und macht die ganze Logik falsch.

Bitte helfen Sie mit Ihrem Fachwissen.

+0

ich verwendet 'if [[" $ a "-eq" $ b "]];' und der Fehler "True: Integer-Ausdruck erwartet" ist jetzt weg. Aber nur zuerst, wenn die Bedingung korrekt ausgegeben wird.next, wenn die Bedingung eine falsche Ausgabe anzeigt. –

Antwort

1

Ich fand die Antwort. Das Problem mit meinem Skript war if [ $a -eq $b ]; Schleife.

mit dieser link ich lernte über die Verwendung von [[]], die solche Ausnahmen behandelt.

Ich verwendete if [[ "$a" = "$b" ]] Ausdruck, um den Zustand zu bewerten, der wahr und meine Logik funktioniert. Jeder Vorschlag von Best Practice wird von euch begrüßt. Ich habe viel zu lernen :)

+1

'[" $ a "=" $ b "]' sollte auch funktionieren. Ich würde vorschlagen, die Variablen 'b' und' d' fallen zu lassen und einfach '[[" $ a "= true]]' 'zu schreiben. Verwenden Sie auch aussagekräftigere Variablennamen, z. 'inGlobal' und' inProject' anstelle von 'a' und' c'. – npostavs

+0

Dank @npostavs für den Austausch von Best Practice mit mir. Ich würde sicherlich die Änderungen in meinem Skript machen, um es lesbarer zu machen. –