【发布时间】:2026-01-03 02:50:02
【问题描述】:
我有一个变量data="password: password@123, url: url@123, username: user@123"。
我正在尝试使用分隔符逗号(,)来拆分它。我想出了以下脚本,它在 CentOS Linux 中运行良好。但在 Debian GNU/Linux 9 (Stretch) 中同样不起作用。
IFS=, read -a array <<< $data
echo ${array[1]}
echo ${array[2]}
echo ${array[3]}
给出输出(CentOS Linux):
password: password@123
url: url@123
username: user@123
但对于 Debian GNU/Linux 9 (Stretch),输出为空。请帮帮我!
编辑: 数据的值是从 JSON 响应中获取的。
data=$(vault kv get -format=json myapp/database | jq '.data' | sed '0,/{/ s/{//' | sed -r 's/(.*)}/\1 /' | sed s/\"//g)
echo $data
password: password@123, url: url@123, username: user@123
vault kv get -format=json myapp/database的回复:
{
"request_id": "5eee87f9-16dc-fd62-e249-8737a6cd7041",
"lease_id": "",
"lease_duration": 2764800,
"renewable": false,
"data": {
"password": "password@123",
"url": "url@123",
"username": "user@123"
},
"warnings": null
}
解决方案:此脚本适用于 Centos 和 Ubuntu
data=$(vault kv get -format=json myapp/database | jq '.data')
data=$(echo $data | sed 's/ //g' | sed '0,/{/ s/{//' | sed -r 's/(.*)}/\1 /' | sed 's/\"//g')
IFS=, read -a array <<< $data
【问题讨论】:
-
尝试引用您的变量,
data="password: password@123, url: url@123, username: user@123"; IFS=, read -a array <<< "$data"; declare -p array或printf '%s\n' "${array[0]}" "${array[1]}" "${array[2]}" -
另外,shellcheck.net 是一个很好的 shell 脚本资源。
-
我无法复制;我在两个平台上都得到了相同的结果(CentOS 8.3.2011);数组元素
${array[2]}为空,但那是因为您使用了错误的索引(第一个元素在${array[0]}中)。见pastebin.com/KyDSCfYk -
如果不是这样,你还能edit 包含在Debian 上使用
bash -x运行脚本的输出吗? -
顺便说一句,
jq -r ' .data | to_entries[] | "\(.key): \(.value)"'避免了丑陋的sed后处理。我怀疑你真的特别想用逗号分开;这会产生换行符分隔的输出。