2016-05-26 5 views
0

私は、.csvファイルからユーザーとプロジェクト名を読み込み、ユーザーをconfig.xmlファイルに追加するためのシェルスクリプトを作成しています。以下はシェルスクリプトを使用して.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" の出力がされます私はループ中にそれを使用しているときはfalseですが、whileコマンドを使わずに.csvファイルを読み込むと、trueを示します。 これは私の全論理が間違っているためです。

などのため

:user1がグローバルな役割とproject_aに存在しているので、変数「」真示し、変数bと比較した場合、if式では、それは本当の結果。 しかし、user1がそのプロジェクトロール(project_a)に存在する場合でも、変数cはfalseを示します。理想的には真実であるべきです。

私の推測では、.csvファイルを読み取り、全体の論理は間違っながらループが破壊されてどこかにあります。

あなたの専門知識をお助けください。

+0

私は '[[" $ ""] "$ b"]];を使用し、エラー "真:整数表現が期待されている"しかし、条件が間違った出力を示している場合は、最初に条件が正しいoutput.nextを取得しています。 –

答えて

1

私は答えを見つけました。私のスクリプトの問題はループif [ $a -eq $b ];でした。このlink

私はこのような例外を処理する[[]]を使用して学びました。

私は真の結果、私のロジックの仕事をした状態を評価するためにif [[ "$a" = "$b" ]]表現を使用。ベストプラクティスの提案は皆さんから歓迎されます。私は学ぶべきことがたくさんある:

+1

'[" $ a "=" $ b "]'もうまくいくはずです。私は 'b'と' d'変数を削除し、 '[[" $ a "= true]]'を書くことを提案します。また、より記述的な変数名を使用してください。 'a'と' c'の代わりに 'inGlobal'と' inProject'を呼び出します。 – npostavs

+0

私とベストプラクティスを共有してくれてありがとう@npostavs。私はそれをより読みやすくするためにスクリプトの変更を確実に行います。 –

関連する問題