bash数组中的额外字符

时间:2013-08-08 07:21:01

标签: arrays bash

我的临时文件。

{"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"} ,

我最后的卷曲命令失败了。

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

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

注意echo输出中的额外''

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

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

2 个答案:

答案 0 :(得分:1)

要剥去额外的“,”你可以做类似的事情:

JSON='{"label": "Allowed","value": "20863962"} , {"label": "Denied","value": "5"} ,'
echo ${JSON%?}
# {"label": "Allowed","value": "20863962"} , {"label": "Denied","value": "5"}

答案 1 :(得分:1)

IFS=$'\r\n' items=($(cat < ./tmp))

当使用格式var =($ var2)或var =($(command))时,如果其上的字符串包含模式,则它将受到路径名扩展的影响,这可能导致代表现有的文件名,因此有时使用阅读是可取的。无论如何,这是我可能用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))