2

我的 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]}
4

2 回答 2

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 中的非空白分隔符序列,只有空白字符。

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

于 2013-09-02T10:09:09.727 回答
0

在你的 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-)
于 2013-09-02T09:56:01.230 回答