Bash脚本中如何将jq获取的带空格JSON值赋值变量并转义空格?
解决Bash中jq提取带空格JSON字段的变量赋值与空格转义问题
问题根源
你之前的命令失效的核心原因是:
$(jq ...)的命令替换会将jq输出的换行符转换为空格,加上echo的处理,原本两行的输出变成了一串用空格分隔的单词。- Bash的
read默认按IFS(空格、制表符、换行)分割输入,导致TITLE只拿到第一个单词,DESCRIPTION拿到第二个,剩余内容被丢弃。
解决方案一:先正确赋值,再批量转义空格
先通过修改IFS让read仅按换行分割输入,确保完整读取每个字段,再统一转义空格:
# 修改IFS为仅换行,确保read按行读取两个字段 IFS=$'\n' read -r TITLE DESCRIPTION < <(jq -r '.meta | .title, .description' ./project.json) # 对变量中的空格进行转义 TITLE=${TITLE// /\\ } DESCRIPTION=${DESCRIPTION// /\\ }
解决方案二:让jq直接输出转义后的内容(一步到位)
在jq命令中直接处理空格转义,输出时就带反斜杠,read直接读取转义后的结果:
read -r TITLE DESCRIPTION < <(jq -r ' .meta | .title | gsub(" "; "\\\\ "), .description | gsub(" "; "\\\\ ") ' ./project.json)
这里gsub(" "; "\\\\ ")是jq的字符串替换:把空格替换为\ (因为jq中反斜杠需要双重转义,所以用四个反斜杠表示最终输出一个反斜杠)。
验证效果
执行完上述命令后,可通过以下方式验证:
# 查看转义后的TITLE echo "$TITLE" # 输出:This\ is\ a\ title # 查看转义后的DESCRIPTION echo "$DESCRIPTION" # 输出:Just\ a\ description
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

