我想将使用--field-separator-zero生成的psql查询的输出读入我的bash脚本中的数组。我尝试过的最好的是以下内容:
psql -w -t --quiet --no-align --field-separator-zero -c $'select nickname,first_name,last_name,email from users' | while IFS= read -d '' -a USERS; do
echo ${USERS[0]} ${USERS[1]} ${USERS[2]} ${USERS[3]};
done;
上面会将一行的每个字段作为新数组返回。将分隔符更改为其他任何内容都会使该过程正常工作,但问题是昵称字段可能包含任何字符,因此我不得不使用安全NUL字符作为分隔符。有没有办法做到这一点?
答案 0 :(得分:2)
我在这里假设昵称是唯一的密钥;如果在该角色中应该使用不同的字段,则进行适当的修改。
以下代码将数据读入一系列关联数组,并依次发出每一行。
请注意,关联数组是Bash 4的一个特性;如果您使用的是运行3.2的Mac OS,请使用MacPorts或类似工具安装现代版本。
declare -A first_names=( ) last_names=( ) emails=( )
while IFS= read -r -d '' nickname && \
IFS= read -r -d '' first_name && \
IFS= read -r -d '' last_name && \
IFS= read -r -d '' email; do
first_names[$nickname]=$first_name
last_names[$nickname]=$last_name
emails[$nickname]=$email
done < <(psql ...)
echo "Found users: "
for nickname in "${!emails[@]}"; do
printf 'nickname - %q\n' "$nickname"
printf 'email - %q\n' "${emails[$nickname]}"
printf 'first name - %q\n' "${first_names[$nickname]}"
printf 'last name - %q\n' "${last_names[$nickname]}"
echo
done
BashFAQ #1中描述了这种技术 - 搜索-print0
以便找到它。