【发布时间】:2019-03-10 23:49:38
【问题描述】:
我是 bash 脚本的新手。
我收到一些 json 响应,但我从响应中只得到一个属性。我想将它保存到一个变量中,但它不起作用
token=$result |sed -n -e 's/^.*access_token":"//p' | cut -d'"' -f1
echo $token
它返回空行。
我不能使用 jq 或任何第三方工具。
请让我知道我缺少什么。
【问题讨论】:
我是 bash 脚本的新手。
我收到一些 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。
始终鼓励引用您的变量,以避免出现空格和全局字符(如*)的问题。
顺便说一句,请注意,您可能可以使用以下方式获得输出:
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 通过称为 command substituion 的过程设置为在 subshell 内运行的脚本的输出/结果 -E 在sed 中允许Extended Regular Expressions。我们想要这个,因为 JSON 通常在 : 之后和下一个 " 之前包含一个空格。我们在空格后使用? 告诉sed 空格可能存在也可能不存在。<<<"$result" 是一个 herestring,它将数据作为标准输入输入到 sed,而不是文件。【讨论】:
sed -E 不“允许正则表达式”,它启用扩展正则表达式。没有-E,某些功能将不可用,但始终允许使用基本正则表达式。