首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取数组shell脚本的值并设置为变量

获取数组shell脚本的值并设置为变量
EN

Stack Overflow用户
提问于 2020-01-21 15:07:40
回答 2查看 2.4K关注 0票数 1

如何根据搜索字符串分隔数组中获取的值​​?示例:我使用以下代码:

代码语言:javascript
复制
#!/bin/bash
#Ref =  https://www.linuxquestions.org/questions/programming-9/bash-to-loop-thorouh-mysql-select-array-882907/#post5798608#
#
DBUSER="user"
DBNAME="pass"
results=($(mysql --user ${DBUSER}  ${DBNAME} -Bse "select phonenumber, userattr from usersSis WHERE sendMSG = '0';"))
cnt=${#results[@]}

for (( i=0; i<${cnt}; i++ ))
do
    echo "Total. $i: ${results[$i]} "

#    NumPhone1=${results[0]};
#    CodPhone1=${results[1]};
#    NumPhone2=${results[2]};
#    CodPhone2=${results[3]};

echo "---------------------------------------------------------------------------------------------------"
done

结果是:

代码语言:javascript
复制
Total. 0: 1223121219
---------------------------------------------------------------------------------------------------
Total. 1: 667
---------------------------------------------------------------------------------------------------
Total. 2: 3223121219
---------------------------------------------------------------------------------------------------
Total. 3: 2005
---------------------------------------------------------------------------------------------------
Total. 4: 5223121219
---------------------------------------------------------------------------------------------------
Total. 5: 545454
---------------------------------------------------------------------------------------------------

它们可能是这样的吗?REF:Loop through an array of strings in Bash?创建关联数组。一本字典:

代码语言:javascript
复制
declare -A continent

continent[Vietnam]=Asia
continent[France]=Europe
continent[Argentina]=America

for item in "${!continent[@]}"; 
  do
    printf "$item is in ${continent[$item]} \n"
  done
Output:

 Argentina is in America
 Vietnam is in Asia
 France is in Europe

var1 = 1223121219和var2 = 667 var3 = ...和var4 = ... ...

EN

回答 2

Stack Overflow用户

发布于 2020-01-21 16:11:35

如果我理解您的查询结果格式在每一行都是"phonenum userattr",那么您可以创建一个以userattr为键的关联数组(例如result[$userattr]=phonenum)。要将值分离到关联数组中,可以使用进程替换(而不是命令替换)来向用于创建关联数组的while循环提供输入,例如

代码语言:javascript
复制
#!/bin/bash
#Ref =  https://www.linuxquestions.org/questions/programming-9/bash-to-loop-thorouh-mysql-select-array-882907/#post5798608#
#
DBUSER="user"
DBNAME="pass"

declare -A result

while read -r phone userattr; do
    result[$userattr]=$phone
done < <(mysql --user ${DBUSER}  ${DBNAME} -Bse "select phonenumber, userattr from usersSis WHERE sendMSG = '0';")

for attrib in "${!result[@]}"; do
    printf "%-8s : %s\n" "$attrib" "${result[$attrib]}"
done

(备注:你的cnt=${#result[@]}在上面也能正常工作)

我没有您的数据库来测试,但是使用上面的值作为每行输入的"phonenum userattr",输出将是:

代码语言:javascript
复制
545454   : 5223121219
2005     : 3223121219
667      : 1223121219

(注意:注意:关联数组是否保持数据输入的顺序,它是一个关联数组,元素的添加顺序是无关紧要的)

使用的测试输入

考虑到您遇到的困难,有必要执行几个故障排除步骤并进行比较。使用输出的post,命令的输出:

代码语言:javascript
复制
mysql --user ${DBUSER}  ${DBNAME} -Bse "select phonenumber, userattr from usersSis WHERE sendMSG = '0';"

应该是:

代码语言:javascript
复制
1223121219 667
3223121219 2005
5223121219 545454

因此,让我们使用一个简单的输入文件进行测试。将上述内容保存到计算机上的文件中。我用sqlout写的,例如:

代码语言:javascript
复制
$ cat sqlout
1223121219 667
3223121219 2005
5223121219 545454

现在更改脚本以读取文件,而不是进程替换,例如

代码语言:javascript
复制
#!/bin/bash

declare -A result

while read -r phone userattr; do
    result[$userattr]=$phone
done < sqlout

echo "${#result[@]} entries"

for attrib in "${!result[@]}"; do
    printf "%-8s : %s\n" "$attrib" "${result[$attrib]}"
done

然后运行脚本并检查是否获得了所有输出,例如

示例使用/输出

代码语言:javascript
复制
$ bash readmysql.sh
3 entries
545454   : 5223121219
2005     : 3223121219
667      : 1223121219

如果您没有得到相同的输出,请让我知道,我们将从那里开始。

票数 0
EN

Stack Overflow用户

发布于 2020-01-22 09:39:54

代码语言:javascript
复制
mysql> select * from usersSis;
+----+-------+-------------+----------+------------+---------+
| id | ipNow | phonenumber | userattr | dateExpire | sendMSG |
+----+-------+-------------+----------+------------+---------+
|  1 | NULL  | 1223121219  | 667      | NULL       | 0       |
|  2 | NULL  | 3223121219  | 2005     | NULL       | 0       |
|  3 | NULL  | 5223121219  | 545454   | NULL       | 0       |
+----+-------+-------------+----------+------------+---------+
3 rows in set (0.00 sec)

mysql>

cod: root@us:/var/www/html/arquivos#的结果。/script.sh 545454 : 2005 : 667:

在script >中,您可以编写示例代码=D

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59835791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档