2016-05-26 111 views
0

我正在創建一個shell腳本以從.csv文件讀取用戶名和項目名,並添加用戶名爲config.xml文件。使用shell腳本讀取.csv文件打破條件循環邏輯

enter image description here

下面是示例xml文件

<?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> 

下面是代碼段,其我面臨

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 

問題: 1)變量 「c」 輸出是當我在while循環中使用它時爲false,但是當我使用它而沒有使用while命令讀取.csv文件時,它顯示爲true。因爲這個,我的整個邏輯出錯了。

例如:user1存在於全局角色和project_a中,所以變量「a」顯示爲真,並且如果與if表達式中的變量b比較,則結果爲真。 ,但即使user1存在於該項目角色(project_a)中,變量c也顯示爲false。理想情況下,這應該是真的。

我的猜測是在閱讀.csv文件並使整個邏輯錯誤時,循環崩潰的地方。

請幫助您的專業知識。

+0

我使用了'if [[「$ a」-eq「$ b」]];'和錯誤「true:整數表達式期望」現在不見了。但是,如果條件顯示錯誤的輸出,則只有當條件得到正確的output.next時纔是第一個。 –

回答

1

我想出了答案。我的腳本的問題是if [ $a -eq $b ];循環。

與此link我學會了使用[[]]來處理這些異常。

我用if [[ "$a" = "$b" ]]表達式來評估導致真實並使我的邏輯工作的條件。任何有關最佳實踐的建議都會受到你們的歡迎。我有很多東西要學:)

+1

'[「$ a」=「$ b」]'也應該有效。我會建議刪除'b'和'd'變量並且只寫'[[「$ a」= true]]''。另外,使用更多的描述性變量名稱,例如inGlobal和inProject代替a和c。 – npostavs

+0

感謝@npostavs與我分享最佳實踐。我肯定會對腳本進行更改以使其更具可讀性。 –