我正在尝试生成 json 输出,其中输入来自 shell 变量。
happystring="Bob Ross"
unhappynumber1="1942"
unhappyboolean=true
JSON=$(jq -n \
--arg happystring "$happystring" --arg unhappynumber1 "$unhappynumber1" \
--arg unhappyboolean $unhappyboolean \
'
{
happystring: $happystring,
unhappynumber1: $unhappynumber1,
unhappyboolean: $unhappyboolean
}
')
echo "$JSON" | jq
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
{
"happystring": "Bob Ross",
"unhappynumber1": "1942",
"unhappyboolean": "true"
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以用tonumber一个简单的过滤器将字符串转换为数字。但是,我无法弄清楚如何将字符串转换为布尔值。而且我在从 shell vars 采购和创建新的 json 作为输出时无法推理如何做。
期望的输出:
{
"happystring": "Bob Ross",
"unhappynumber1": 1942,
"unhappyboolean": true
}
Run Code Online (Sandbox Code Playgroud)
如果我在一个步骤中生成 json 并将其存储在 shell var 中,然后在第二个步骤中执行额外的转换,会更容易或更清楚吗?
您可以使用test过滤器进行检查并返回 true/false。我认为你可以直接使用过滤器,不需要创建 json 并再次转换。
happystring="Bob Ross"
unhappynumber1="1942"
unhappyboolean=true
JSON=$(jq -n \
--arg happystring "$happystring" --arg unhappynumber1 "$unhappynumber1" \
--arg unhappyboolean $unhappyboolean \
'
{
happystring: $happystring,
unhappynumber1: $unhappynumber1 | tonumber,
unhappyboolean: $unhappyboolean | test("true")
}
')
echo "$JSON" | jq
Run Code Online (Sandbox Code Playgroud)
输出如下:
{
"happystring": "Bob Ross",
"unhappynumber1": 1942,
"unhappyboolean": true
}
Run Code Online (Sandbox Code Playgroud)
不需要将变量转换为字符串,就像--arg只将它们转换回来一样,您可以使用--argjson并仍然单独输入它们,但类型由正常的 JSON 规则确定:
happystring='"Bob Ross"'
unhappynumber1=1942
unhappyboolean=true
JSON=$(jq -n \
--argjson happystring "$happystring" \
--argjson unhappynumber1 "$unhappynumber1" \
--argjson unhappyboolean "$unhappyboolean" \
'
{
happystring: $happystring,
unhappynumber1: $unhappynumber1,
unhappyboolean: $unhappyboolean
}
')
echo "$JSON"
Run Code Online (Sandbox Code Playgroud)
如果您不希望字符串参数需要文字引号,您也可以混合--arg使用字符串和--argjson其他所有内容",因为手册中关于 shell 引用和程序文本的注释确实适用于任何需要在 shell 中转义的字符的参数:
注意:注意 shell 的引用规则很重要。作为一般规则,最好总是引用(使用单引号字符)jq 程序,因为太多对 jq 具有特殊含义的字符也是 shell 元字符。例如,jq "foo" 将在大多数 Unix shell 上失败,因为它与 jq foo 相同,后者通常会失败,因为 foo 未定义。使用 Windows 命令外壳 (cmd.exe) 时,最好在命令行上给出 jq 程序时使用双引号(而不是 -f 程序文件选项),但随后 jq 程序中的双引号需要反斜杠转义。
| 归档时间: |
|
| 查看次数: |
3074 次 |
| 最近记录: |