2016-11-17 139 views
0

我有以下代码:猛砸建筑串

streams=("CI" "UI" "QA") 
role_text="streams:read:" 
result="" 

for s in "${streams[@]}" 
do 
    STREAMID=$(curl -s -u $user:$pass -X GET -H "Content-Type: application/json" ${GRAYLOG2_URL}/streams | python /opt/script.py $s) 
    curl -s -u $user:$pass -X POST -H "Content-Type: application/json" ${GRAYLOG2_URL}/streams/${STREAMID}/resume > /dev/null 
    result=$result$role_text$STREAMID, 
    echo "result: "$result 
done 

final_result=$(echo $result | sed '$s/.$//') 
ROLES=$(curl -u $user:$pass -X GET -H "Content-Type: application/json" ${GRAYLOG2_URL}/roles 2>/dev/null) 
echo "Final result: "$final_result 
GRAYLOG2_ROLE=' 
{ 
    "name" : "'$role'", 
    "description" : "'${role}' role", 
    "permissions" : [ "'${final_result}'" ], 
    "read_only" : false 
}' 

${final_result}应该是一个字符串,如:

"streams:read:582e0b99b9d3230d808cc0d0", "streams:read:582e0b99b9d3230d808cc0d4", "streams:read:582e0b98b9d3230d808cc0cb" 

相反,结果我得到的是:

"streams:read:582e0b98b9d3230d808cc0cb,streams:read:582e0b99b9d3230d808cc0d0,streams:read:582e0b99b9d3230d808cc0d4" 

这显然,它不应该如此。

任何人都可以告诉我如何得到所需的结果吗?

非常感谢你, 加布里埃尔

+0

是什么让你认为引号和空格会被bash var concatenation保存下来?你必须逃避它们。 –

+0

这是预期的。您正在打印一个字符串而不是一个数组。在bash中打印这样的数组也是不容易的。我会用转义字符打印它,并用不同的语言进行拆分。 – spa900

+0

将所有变量引用放在双引号中!例如,使用'curl -s -u“$ user:$ pass”...'和'echo“结果:$ result”'。我不知道这是否是特定问题的根源,但在完成之前,并不值得仔细查看。顺便说一下,[shellcheck.net](http://www.shellcheck.net)对于像这样进行基本的理智检查非常方便。 –

回答

0

我的问题是有关该${final_result}应该已经像一个字符串数组创建的事实:

"streams:read:582e0b99b9d3230d808cc0d0", "streams:read:582e0b99b9d3230d808cc0d4", "streams:read:582e0b98b9d3230d808cc0cb" 

,而是,我会得到一个大的字符串,如:

"streams:read:582e0b98b9d3230d808cc0cb,streams:read:582e0b99b9d3230d808cc0d0,streams:read:582e0b99b9d3230d808cc0d4" 

我接到一个同事的帮助,解决这样的问题:

result="$result\"$role_text$STREAMID\"" 

谢谢大家的目光并指向正确的方向。 Gabriel