bash 引号内的字符串格式

bash string formatting within a quote

我试图在 bash 脚本中概括一个命令,但我受困于一些字符串格式。 我正在尝试重新创建的代码(有效)

curl -X POST -H 'Content-Type: application/json' $CLUSTER -d '{
      "source" : "s3://blah/part-00004-9d2ba62f-496e-4cfd-9001-f40f0e33e927-c000.csv",
      "format" : "csv"
    }'

使用以下命令(不起作用)

filename='part-00004-9d2ba62f-496e-4cfd-9001-f40f0e33e927-c000.csv'
curl -X POST -H 'Content-Type: application/json' $CLUSTER -d '{
    "source" : "s3://blah/$filename",
    "format" : "csv"
    }'

我也尝试了 Expansion of variables inside single quotes in a command in Bash 的提示,但没有成功。

"source" : '"s3://blah/$filename"',

有什么想法吗?

试试这个(参见 "'"):

filename='part-00004-9d2ba62f-496e-4cfd-9001-f40f0e33e927-c000.csv'
curl -X POST -H 'Content-Type: application/json' $CLUSTER -d '{
    "source" : "'"s3://blah/$filename"'",
    "format" : "csv"
    }'

第一个 "'" 是“-d 参数的双引号符号,关闭单引号转义,开始双引号转义”。第二个"'"类似

我喜欢使用 jq 从 shell 脚本中用户提供的值构建 JSON,如果您的文件名(或其他)碰巧有JSON 中需要特殊处理的任何字符都会自动处理。像

filename='part-00004-9d2ba62f-496e-4cfd-9001-f40f0e33e927-c000.csv'
curl -X POST \
  -H 'Content-Type: application/json' \
  "$CLUSTER" \
  -d "$(jq -n --arg filename "$filename" '{source:"s3://blah/\($filename)",format:"csv"}')"