【问题标题】:Splitting mysql query output into variables将mysql查询输出拆分为变量
【发布时间】:2021-07-08 11:55:22
【问题描述】:

我正在尝试使用 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 个标记,但是当我尝试拆分时,它只返回第一个。我认为,这是分隔符的错误,但我真的不知道这里使用了什么分隔符,如果不是空格的话。 谁能帮帮我?

【问题讨论】:

  • mysql 输出是制表符分隔的。查找 man bash 并让您的“阅读”认识到这一点
  • @danblack 和IFS=' '; 在读取之前,第一个输出没有变化,但第二个回显被分成几行。是否有另一种方法可以让“读取”识别分隔符?
  • read -d \t ...

标签: mysql shell mariadb


【解决方案1】:

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') )

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

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

【讨论】:

  • 感谢您的回答,我的代码适用于@danblack 的建议,我添加了read -d \t,但我也会按照您的方式进行检查。谢谢
猜你喜欢
  • 2019-04-08
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
相关资源
最近更新 更多