【问题标题】:bash variable interpolation with an integer [duplicate]带有整数的bash变量插值[重复]
【发布时间】:2020-01-06 18:33:03
【问题描述】:

我正在尝试使用 curl 提交要求参数之一为整数的请求。我希望能够为该整数使用一个变量,但如果它不显示为字符串或无法替换变量,我无法弄清楚如何做到这一点。

stringVar="L"
intVar=4

JSON=\''{"stringVar": "'"$stringVar"'","intVar": "'"$intVar"'" }'\'


printf '%s\n' "$JSON"

我已经尝试了所有我能想到的引号组合,没有引号和大括号,但无法弄清楚。

【问题讨论】:

  • 你能发布想要的结果吗?
  • 我不同意这个问题是两个链接的重复。 stackoverflow.com/questions/48470049/… 这个没有回答我在生成带有整数的 json 字符串时遇到的主要问题。 stackoverflow.com/questions/48887711/…这个问题问的是使用特定工具的时候怎么做。
  • 第二个填写第一个缺少的信息。把它们结合起来,你就有了一个副本。也就是说,我并不是要通过标记来暗示它是每个预先存在的问题的副本,而是我们有多个更窄的预先存在的问题,它们组合起来就是同一件事。

标签: bash curl


【解决方案1】:

永远不要生成带有字符串连接的 JSON。 不保证结果是有效的 JSON(任何兼容的解析器都会接受),除非它是由兼容的生成器生成的。对于 bash,两种用途最广泛可用的工具之一是 jq

# taken from the question
stringVar="L"; intVar=4

json=$(jq -n \
          --arg stringVar "$stringVar" \
          --arg intVar "$intVar" \
          '{"stringVar": $stringVar, "intVar": $intVar | tonumber}')

【讨论】:

  • 上面的代码指向jq: error (at <unknown>): Expected JSON value (while parsing '')
  • 也用 jq-1.6 测试过。我也做了复制和粘贴。
  • @accdias,您是否先设置了 OP 的 stringVarintVar
  • 嘿。是的,尝试将空字符串解析为整数(就像$intVar | tonumberintVar 为空或不是数字时所做的那样)将显式失败,而不是生成不正确的JSON(就像使用原始代码一样)。这是一个特性,而不是一个错误。 :)
  • @Corey,当您的测试用例很简单时,它只能在没有引号的情况下工作。将其更改为stringVar='*' 或什至只是stringVar='two words',然后--arg stringVar $stringVar 将不再起作用。 (一般来说,bash 充满了这些微妙的陷阱,所以试图通过反复试验找出什么是“正确的”是危险的;请参阅 BashPitfallsBashFAQ 以获取更多可靠答案的案例示例不明显)。
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2017-01-08
  • 2017-11-19
  • 1970-01-01
  • 2012-01-05
  • 2019-08-20
相关资源
最近更新 更多