【问题标题】:Bash mysql array do not get empty valueBash mysql数组没有得到空值
【发布时间】:2013-09-05 09:10:54
【问题描述】:

我的 Bash 脚本从 MySQL 创建一个数组:

info_tmp=$(mysql --batch --silent -u root -ppassword database -e "SELECT id,info1,info2 FROM table WHERE id=1")
info=($(for i in $info_tmp;do echo $i;done))
info1=${info[1]}

我的问题是,如果 info1 在数据库中是一个空字符串,那么 $info1 就变成了 info2。 如何将空字符串放入 $info 数组?

Mysql Database: 
Id | info1 | info2 
 1 |       | data2 
 2 | data3 | data4 

$info_tmp 
1 data2 
2 data3 data4

感谢您的回答

这是最终有效的代码 (@Barmar):

IFS="|"
info_tmp=$(mysql --batch --silent -u root -ppassword database -e "SELECT CONCAT_WS('|', id,info1,info2) FROM table WHERE id=1")
info=(${info_tmp// / })
info1=${info[1]}

【问题讨论】:

  • 你能提供一些info_tmp变量的例子吗?
  • @Aleks-DanielJakimenko 问题是当数据库中的一列是空字符串时,bash 只会看到一对 TAB 字符,它被视为一个分隔符而不是两个分隔符空值。

标签: mysql arrays bash string


【解决方案1】:

如果有一个字符不应该出现在任何列中,请将其用作分隔符。

IFS="|"
info_tmp=$(mysql --batch --silent -u root -ppassword database -e "SELECT CONCAT_WS('|', id,info1,info2) FROM table WHERE id=1")

这是因为 bash 不会合并 IFS 中的非空白分隔符序列,只有空白字符。

我不确定将$info_tmp 复制到$infofor 循环的意义是什么,但您需要在那里做同样的事情。如果您使用空格作为单词分隔符,您将永远无法从命令替换中获得空数组值。

【讨论】:

  • 谢谢@Barmar,它似乎有效,我可以循环访问 $info_tmp for i in $info_tmp ; do echo $i ; done 但我无法访问像 echo ${info_tmp[1]} 这样的数组元素如何访问各个元素?
  • 当我测试这个时,我访问${info_tmp[1]}没有任何问题。
  • 这种方式有效:在你的代码之后info=(${info_tmp// / }) 然后${info[1]} 是 info1
【解决方案2】:

在你的 for 循环中临时添加一个字符怎么样:

info_tmp=$(mysql --batch --silent -u root -ppassword database -e "SELECT id,info1,info2 FROM table WHERE id=1")
info=($(for i in $info_tmp;do echo " "$i;done))
info1=$(${info[1]} | cut -c 2-)

【讨论】:

  • 问题在于分配给info_tmp,而不是info
猜你喜欢
  • 2013-11-17
  • 1970-01-01
  • 2016-11-07
  • 2012-03-03
  • 1970-01-01
  • 2021-12-31
  • 2021-01-24
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多