Bash 捕获包含引号和环境变量的命令的输出

Bash 捕获包含引号和环境变量的命令的输出,bash,Bash,我知道我可以像这样捕获bash命令的输出: OUTPUT="$(ls -1)" echo "${OUTPUT}" 但我的命令本身包含很多引号: OUTPUT="$(curl -v -u ${USER}:${PASSWD} -X POST -H "Content-Type: application/json" -d '{ "xxx": true, "xxx2": "date", ... }' https://${ENV}/${ROOT}/api/try)" 但这将返回一个空字符串: echo

我知道我可以像这样捕获bash命令的输出:

OUTPUT="$(ls -1)"
echo "${OUTPUT}"
但我的命令本身包含很多引号:

OUTPUT="$(curl -v -u ${USER}:${PASSWD} -X POST -H "Content-Type: application/json" -d '{
"xxx": true,
"xxx2": "date",
...
}' https://${ENV}/${ROOT}/api/try)"
但这将返回一个空字符串:

echo $OUTPUT

如何捕获此命令的输出?

有两种方法,要么用\“”转义字符串中的引号,要么使用单引号,即

% BLA="bla \"a\""
% echo $BLA
bla "a"
% BLA='bla "a"'
% echo $BLA
bla "a"

Bash可以很好地处理嵌套的引号和括号,但事实并非如此

OUTPUT="$(curl -v -u ${USER}:${PASSWD} -X POST -H "Content-Type: application/json" -d '{
"xxx": true,
"xxx2": "date",
...
}' https://${ENV}/${ROOT}/api/try)"

有可能是
curl
本身没有响应任何内容。

只需使用复杂的命令创建一个函数:

cmdfn() {
   curl -v -u ${USER}:${PASSWD} -X POST -H "Content-Type: application/json" -d '{
   "xxx": true,
   "xxx2": "date",
   ...
   }' https://${ENV}/${ROOT}/api/try
}
然后在命令替换中调用它,如下所示:

output="$(cmdfn)"

返回空字符串与引号无关。即使在命令行中运行而不捕获输出,您的
curl
查询也可能返回空字符串