0

我的临时文件。

{"label": "Allowed","value": "20863962"} ,
{"label": "Denied","value": "5"} ,

读入一个数组。

#Read into array
IFS=$'\r\n' items=($(cat < ./tmp))
# print all items
echo "${items[@]}"

输出显示:

{"label": "Allowed","value": "20863962"} , {"label": "Denied","value": "5"} ,

我最后的 curl 命令失败了。

当我使用 -x 运行脚本时,它会在输出中显示额外的字符,我怀疑这可能导致我的最终 curl 命令失败。

+ echo '{"label": "Allowed","value": "20863962"} ,' '{"label": "Denied","value": "5"} ,'

请注意回显输出中的额外“”

我最终的 curl 命令应该是这样的:

curl -d '{ "auth_token":"pass", "items": [{"label": "Allowed","value": "20863962"} , {"label": "Denied","value": "5"}] }' http://lab:3030/widgets/test
4

2 回答 2

1

要去除多余的“,”,您可以执行以下操作:

JSON='{"label": "Allowed","value": "20863962"} , {"label": "Denied","value": "5"} ,'
echo ${JSON%?}
# {"label": "Allowed","value": "20863962"} , {"label": "Denied","value": "5"}
于 2013-08-08T07:32:54.937 回答
1
IFS=$'\r\n' items=($(cat < ./tmp))

当使用 var=($var2) 或 var=($(command)) 格式时,如果其上的字符串包含模式,它将受到路径名扩展的影响,这可能导致表示现有文件名,因此有时使用 read 更可取. 无论如何,这就是我可能会如何使用 bash。您可能会发现它也很有帮助。

#!/bin/bash

shopt -s extglob  ## enable extended patterns
IFS=$'\n' read -rd ''-a items  < file  ## read input to array
items=("${items[@]##+([^\{])}")  ## removing extra leading characters
items=("${items[@]%%+([^\}])?($'\r')}")  ## removing extra trailing characters

IFS=,  ## set IFS to , to separate values by commas in "${var[*]}"
echo curl -d "{ \"auth_token\":\"pass\", \"items\": [${items[*]}] }" "http://lab:3030/widgets/test"

您也可以使用 noglob 完全禁用路径名扩展。这也仅在运行脚本的 shell 上有效。

shopt -u -o noglob  ## or set +o noglob, or set +f
IFS=$'\r\n' items=($(cat < ./tmp))  ## simply the same as IFS=$'\r\n' items=($(<./tmp))
于 2013-08-08T08:37:15.463 回答