将 mysql 查询输出拆分为变量

Splitting mysql query output into variables

我正在尝试使用 shell 脚本来拆分 mysql 查询输出并将其保存在变量中。我的代码如下所示:

#!/bin/bash
read -ra tokens<<<$(mysql -u root -p'password' -D'users_info' -se 'SELECT token FROM users_logs')
for i in "${tokens[@]}"; do
        echo $i
done
var=$(mysql -u root -p'password' -D'users_info' -se 'SELECT token FROM users_logs')
echo $var

和脚本输出:

2z7bhxbk7egquokj855d3
2z7bhxbk7egquokj855d3 we3cq1d95drdq3micu9cn we3cq1d95drdq3micu9cn

如您所见,查询结果是底部的,它包含 3 个标记,但是当我尝试拆分时,它 returns 只有第一个。我认为,这是定界符错误,但我真的不知道这里使用的是什么定界符,如果不是 space。 谁能帮帮我?

read 使用制表符应该没有问题。我怀疑问题真的出在换行符上——一行,一读。试试这个方法 -

while read -r t; do
  tokens+=("$t")
  echo "${tokens[@]" # should show them accumulating
done < <(mysql -u root -p'password' -D'users_info' -se 'SELECT token FROM users_logs')

例如,

$: while read -r t; do tokens+=("$t"); echo "${tokens[@]}"; done < <( printf "%s\n" a b c  )
a
a b
a b c

然而,你所做的基本上是这样的:

$: read -ra t < <( printf "%s\n" a b c d e f g ) # only reads 1st line
$: echo "${#t[@]} ${t[@]}"
1 a

在这种特定情况下...

可以可能使用直接赋值给数组的坏习惯。

tokens=( $(mysql -u root -p'password' -D'users_info' -se 'SELECT token FROM users_logs') )

但是不要这样做,除非您要在查询中添加一些数据检查。由于多种原因,这通常是一个可怕的习惯,即使这些标记不应该有任何嵌入的空格。

你这样做的方式更好。您只需要每行阅读一次。