【问题标题】:Reading .csv file using shell script breaking conditional loop logic使用 shell 脚本读取 .csv 文件打破条件循环逻辑
【发布时间】:2016-05-26 07:33:49
【问题描述】:

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

下面是示例 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>

下面是代码sn-p

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)当我在while循环中使用它时,变量“c”输出为假,但当我使用它而不使用while命令读取.csv文件时,它显示为真。 因此,我的整个逻辑都出错了。

例如:user1 存在于全局角色和project_a 中,因此变量“a”显示为true,并且当与if 表达式中的变量b 比较时,结果为true。 但即使 user1 存在于该项目角色 (project_a) 中,变量 c 也会显示为 false。理想情况下应该是真的。

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

请帮助您的专业知识。

【问题讨论】:

  • 我使用了if [[ "$a" -eq "$b" ]];,错误“true: integer expression expected”现在消失了。但仅当条件得到正确输出时才首先。如果条件显示错误输出,则下一个。

标签: linux shell csv centos xmlstarlet


【解决方案1】:

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

通过这个link 我了解了如何使用处理此类异常的 [[ ]]。

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

【讨论】:

  • [ "$a" = "$b" ] 也应该可以工作。我建议删除bd 变量,只写[[ "$a" = true ]]。此外,使用更具描述性的变量名称,例如inGlobalinProject 而不是 ac
  • 感谢@npostavs 与我分享最佳实践。我肯定会在我的脚本中进行更改以使其更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多