【发布时间】:2016-11-17 20:29:29
【问题描述】:
我有以下代码:
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"
这显然不能正常工作。
谁能告诉我如何获得所需的结果?
非常感谢, 加布里埃尔
【问题讨论】:
-
是什么让您认为 bash var 连接会保留引号和空格?你必须逃离他们。
-
这符合预期。您正在打印一个字符串而不是一个数组。在 bash 中打印这样的数组也不容易。我会用转义字符打印它并用不同的语言进行拆分。
-
将所有变量引用放在双引号中!例如,使用
curl -s -u "$user:$pass" ...和echo "result: $result"。我不知道这是否是特定问题的根源,但在您完成之前,不值得详细查看它。顺便说一句,shellcheck.net 对于像这样进行基本的完整性检查非常方便。 -
要从当前输出转换到预期输出,您可以附加
| sed "s/\,/\",\"/g"。
标签: string bash concatenation