Shell命令替换内使用变量被识别为命令,语法哪里出错了?
写法1报错原因
$()属于命令替换语法,作用是执行括号内的命令,并将命令的标准输出作为替换结果。你在括号内直接写$a,shell会先将变量a的内容展开为{"a": 1},然后尝试把该字符串当做系统命令执行,自然会触发{"a":: command not found的报错。你需要先通过echo命令将变量内容输出到标准输出,再通过管道传递给jq处理。
写法2空值原因
管道符|两侧的命令都会在独立的子shell中运行,子shell内的变量赋值无法同步到父shell。同时该写法只是把$a的值赋值给子shell中的临时变量b,没有任何内容输出到管道,jq拿不到输入也不会返回处理结果,最终父shell中的b自然是空值。
正确实现
兼容POSIX标准的通用写法
b=$(echo "$a" | jq '.a')
注意要给变量$a包裹双引号,避免变量内容中的特殊字符、空格被shell意外解析。
现代shell优化写法(bash/zsh等支持)
使用here string直接将变量内容作为标准输入传给jq,不需要启动额外的echo进程,执行效率更高:
b=$(jq '.a' <<< "$a")
内容的提问来源于stack exchange,提问作者Lobstw
相关产品推荐
相关产品推荐

