【发布时间】: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