尝试使用 jq 分配多个变量

Din*_*ero 0 bash shell

我有一个名为$db_main_info包含以下字符串的变量

 { "host": "env-prod-blah-db.blah.us-east-1.rds.amazonaws.com", "dbname": "blahblah", "user": "foobar", "password": "foopassfoopass" }
Run Code Online (Sandbox Code Playgroud)

我正在做以下事情

read host dbname user password < <(echo $db_main_info | jq -r '.host, .dbname, .user, .password')
Run Code Online (Sandbox Code Playgroud)

执行上述语句后,当我这样做时,echo $host它会打印以下内容

env-prod-blah-db.blah.us-east-1.rds.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

dbname然而,其他 3 个变量user永远password不会被设置。我不确定我做错了什么?

我希望变量dbname取值blahblah,变量 user 取值foobar,变量password取值foopassfoopass

M. *_*din 5

jq将每个字段打印在单独的行上,但read默认情况下仅读取一行。一种方法是修改 的默认行为read,通过将换行符分配给IFS,设置该字符用作字段分隔符,并将行分隔符设置为空字符串(以便换行符不再充当分隔符表示行尾):

#!/bin/bash

db_main_info='{ "host": "env-prod-blah-db.blah.us-east-1.rds.amazonaws.com", "dbname": "blahblah", "user": "foobar", "password": "foopassfoopass" }'

IFS=$'\n' read -r -d '' host dbname user password < <(jq -r '.host, .dbname, .user, .password' <<< "$db_main_info")
echo "host=$host"
echo "dbname=$dbname"
echo "user=$user"
echo "password=$password"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“read”命令将“失败”(即返回非零状态),因为它在读取空字节(如果预期终止“行”)之前就到达文件末尾。这通常根本不是问题(并且变量被填充得很好),但是如果您使用了“set -x”或类似的东西来使脚本在任何命令失败时退出......它会退出,因为“read”命令返回失败状态。如果您担心这一点,请添加`|| true` 到该行的末尾,给它一个会成功的备用命令。 (2认同)