for 循环遍历序列,然后通过 json 创建字符串和 post

for loop over sequence, then make string and post via json

考虑这个简单的 bash 脚本:(我写 myurl 作为正确 URL 的占位符;而 myhost 作为正确主机名的占位符这里的隐私。)

for a in `seq 400 450`; do
curl --request POST \
  --url myurl \
  --header 'Content-Type: application/json' \
  --header 'Host: myhost' \
  --data '{
"devID": "21010010",
"count": 0,
"fileEnd": 1,
"line": "",
"file": "$a"
}'
done

这被拒绝为错误的请求。我希望 seq(例如数字 410)的输出是引号分隔的字符串。注意行 "file": "$a"。如果我写 "file": "410",这非常有效,对于 400 到 450 之间的任何其他文件也是如此 - 只要它被 "" 引号包围。

问题:

我想要,在循环的每次迭代中,curl 请求应该包括来自 seq 命令的数字,并用 "" 包围。所以第一个电话应该是:

curl --request POST \
  --url myurl \
  --header 'Content-Type: application/json' \
  --header 'Host: myhost' \
  --data '{
"devID": "21010010",
"count": 0,
"fileEnd": 1,
"line": "",
"file": "400"
}'

下一位:

curl --request POST \
  --url myurl \
  --header 'Content-Type: application/json' \
  --header 'Host: myhost' \
  --data '{
"devID": "21010010",
"count": 0,
"fileEnd": 1,
"line": "",
"file": "401"
}'

等等。

我该怎么做?谢谢。

--data 部分用单引号引起来...

'{"devID": ... "file": "$a"}'

... 禁止在所述单引号内扩展变量引用。

考虑:

$ a=410
$ echo '"devID": "21010010", "file": "${a}"'
"devID": "21010010", "file": "${a}"              # ${a} not expanded

您可以用双引号将 --data 部分括起来,但您还需要转义所有嵌套的双引号。

另一个想法是将 --data 部分分成用单引号括起来的 2x 部分,并将 ${a} 引用放在 2x 部分之间,例如:

$ echo '"devID": "21010010", "file": "'${a}'"'   # change "${a}" to "'${a}'"
"devID": "21010010", "file": "410"               # ${a} successfully expanded

注意:关于单引号和双引号的区别有几个帖子,例如this link