Bash引号转义问题:执行Shell时的转义处理
解决Shell脚本中JSON参数的jq处理转义问题
问题根源
你原来的写法错误在于嵌套sh -c时的引号转义和参数传递逻辑:单引号内部的转义符\不会生效,导致子shell里的$1无法正确引用脚本传入的JSON参数,反而被当作字符串字面量处理。
最优解决方案(无需嵌套sh -c)
直接在脚本里处理参数,避免不必要的子shell嵌套,这是最简洁可靠的方式:
# 方法1:用echo管道 final=$(echo "$1" | jq -r ".[]") # 方法2:用here-string更高效(避免创建echo进程) final=$(jq -r ".[]" <<< "$1")
若必须使用sh -c的正确写法
如果确实需要通过sh -c执行(比如复杂场景下的子shell调用),要通过sh -c的后续参数传递变量,而不是在命令字符串里拼接:
final=$(sh -c 'echo "$1" | jq -r ".[]"' _ "$1")
这里的_是占位符,对应子shell的$0(脚本名位置),后面的"$1"才会被子shell识别为自己的$1参数,完美传递JSON内容且不会出现转义问题。
内容的提问来源于stack exchange,提问作者Tudor Vintilescu
相关产品推荐
相关产品推荐

