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
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 を使用してパス名の展開を完全に無効にすることもできます。これも、スクリプトを実行するシェルでのみ有効です。

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 に答える
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 に答える