在Shell脚本中使用jq向JSON数组添加元素:变量展开问题
解决bash脚本中jq向JSON数组添加元素的变量展开问题
正确实现脚本
以下是能正常给Windows Terminal添加Grape配色方案的bash脚本:
#!/bin/bash # 定义Grape配色方案的JSON对象 GRAPE_COLOR_SCHEME='{ "name": "Grape", "background": "#1E1E3F", "foreground": "#E0E0FF", "cursorColor": "#FFFFFF", "selectionBackground": "#4F4F9F", "colors": [ "#000000", "#FF5555", "#50FA7B", "#F1FA8C", "#BD93F9", "#FF79C6", "#8BE9FD", "#BBBBBB", "#555555", "#FF6E6E", "#69FF94", "#FFFFA5", "#D6ACFF", "#FF92DF", "#A4FFFF", "#FFFFFF" ] }' # 替换为你的Windows Terminal配置文件路径 SETTINGS_PATH="/mnt/c/Users/你的用户名/AppData/Local/Packages/Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState/settings.json" # 用jq将配色方案添加到colorSchemes数组 jq --argjson newScheme "$GRAPE_COLOR_SCHEME" '.colorSchemes += [$newScheme]' "$SETTINGS_PATH" > temp.json && mv temp.json "$SETTINGS_PATH"
常见错误原因
直接变量展开破坏JSON结构
如果直接在jq表达式里嵌入变量(比如jq '.colorSchemes += ['"$GRAPE_COLOR_SCHEME"']'),bash会提前解析JSON里的空格、换行和引号,导致jq收到破碎的语法,触发报错。误用--arg参数
--arg会把传入的内容当作普通字符串处理,而非JSON对象。用它传入配色方案,最终会在数组里添加一个字符串值,导致Windows Terminal配置文件无效。必须用--argjson传递完整的JSON结构。引号处理不当
定义JSON变量时如果用双引号包裹,bash会解析变量内部的双引号,导致变量被截断,出现"无效JSON"报错。必须用单引号包裹整个JSON字符串,避免bash解析内部双引号。
注意事项
- 先替换
SETTINGS_PATH中的用户名,确保路径指向正确的配置文件。 - 脚本通过临时文件
temp.json过渡,避免jq直接写入原文件时清空内容的问题。可以先去掉&& mv temp.json "$SETTINGS_PATH",检查temp.json内容正确后再执行替换。
内容的提问来源于stack exchange,提问作者fernan
相关产品推荐
相关产品推荐

