我正在创建一个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>
以下是代码段
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文件并使整个逻辑错误时循环中断的地方。
请帮助您的专业知识。
答案 0 :(得分:1)
我想出了答案。我的脚本问题是if [ $a -eq $b ];
循环。
使用此link我学会了使用[[]]处理此类异常。
我使用if [[ "$a" = "$b" ]]
表达式来评估导致真实的条件并使我的逻辑工作。欢迎你们提出任何最佳实践建议。我有很多东西需要学习:)