我是bash script的新手。 我收到一些 json 响应,但我只从响应中得到一个属性。我想将其保存到变量中,但它不起作用
token=$result |sed -n -e 's/^.*access_token":"//p' | cut -d'"' -f1
echo $token
它返回空行。 我不能使用 jq 或任何第三方工具。 请让我知道我错过了什么。
你的命令应该是:
token=$(echo "$result" | sed -n -e 's/^.*access_token":"//p' | cut -d'"' -f1)
您需要使用echo
在标准输出上打印变量的内容,并且需要使用命令替换$( )
将管道的输出分配给token
。
始终鼓励引用变量,以避免出现空格和 glob 字符(如*
(的问题。
顺便说一句,请注意,您可能可以使用以下内容获取输出:
token=$(jq -r .access_token <<<"$result")
我知道您说过不能使用jq
但它是一个独立的二进制文件(无需安装它(,并以正确的方式处理您的 JSON,而不是任意文本。
试一试:
token="$(sed -E -n -e 's/^.*access_token": ?"//p' <<<"$result" | cut -d'"' -f1)"
解释:
token="$( script here )"
表示$token设置为通过称为命令替换的过程在子 shell 内运行的脚本的输出/结果sed
中的-E
允许扩展正则表达式。 我们想要这个,因为 JSON 通常在:
之后和下一个"
之前包含一个空格。 我们使用空间后面的?
来告诉sed
空间可能存在,也可能不存在。<<<"$result"
是一个 herestring ,它将数据作为 stdin 代替文件馈送到sed
中。