使用shell脚本读取条件循环逻辑来读取.csv文件

时间:2016-05-26 07:33:50

标签: linux shell csv centos xmlstarlet

我正在创建一个shell脚本来从.csv文件中读取用户和项目名称,并添加用户是config.xml文件。

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中,因此变量“a”显示为true,当与if中的变量b进行比较时,结果为true。 但是,即使user1存在于该项目角色(project_a)中,变量c也显示为false。理想情况下应该是真的。

我的猜测是在读取.csv文件并使整个逻辑错误时循环中断的地方。

请帮助您的专业知识。

1 个答案:

答案 0 :(得分:1)

我想出了答案。我的脚本问题是if [ $a -eq $b ];循环。

使用此link我学会了使用[[]]处理此类异常。

我使用if [[ "$a" = "$b" ]]表达式来评估导致真实的条件并使我的逻辑工作。欢迎你们提出任何最佳实践建议。我有很多东西需要学习:)