[英]Get values of array shell script and set to variables
如何根據搜索字符串將數組中得到的值分開? 示例:我使用此代碼:
#!/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
結果是:
Total. 0: 1223121219
---------------------------------------------------------------------------------------------------
Total. 1: 667
---------------------------------------------------------------------------------------------------
Total. 2: 3223121219
---------------------------------------------------------------------------------------------------
Total. 3: 2005
---------------------------------------------------------------------------------------------------
Total. 4: 5223121219
---------------------------------------------------------------------------------------------------
Total. 5: 545454
---------------------------------------------------------------------------------------------------
他們能像這樣嗎? REF: 在 Bash 中循環遍歷字符串數組? 創建關聯數組。 一本字典:
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 = ... ... ...
如果我理解您的查詢結果格式在每一行都是"phonenum userattr"
,那么您可以創建一個以userattr
鍵的關聯數組(例如result[$userattr]=phonenum
)。 要將值分離到關聯數組中,您可以使用進程替換(而不是命令替換)為用於創建關聯數組的while
循環提供輸入,例如
#!/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"
,輸出將是:
545454 : 5223121219
2005 : 3223121219
667 : 1223121219
(注意:請注意,關聯數組是否保留數據輸入的順序,它是關聯數組,元素添加的順序無關緊要)
使用的測試輸入
鑒於您遇到的困難,有必要采取一些故障排除步驟和比較。 使用您的輸出帖子,您的命令的輸出:
mysql --user ${DBUSER} ${DBNAME} -Bse "select phonenumber, userattr from usersSis WHERE sendMSG = '0';"
應該:
1223121219 667
3223121219 2005
5223121219 545454
所以讓我們用一個簡單的輸入文件進行測試。 將以上內容保存到計算機上的文件中。 我在sqlout
有它,例如
$ cat sqlout
1223121219 667
3223121219 2005
5223121219 545454
現在更改腳本以讀取文件而不是進程替換,例如
#!/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
然后運行腳本並檢查您是否正在獲取所有輸出,例如
示例使用/輸出
$ bash readmysql.sh
3 entries
545454 : 5223121219
2005 : 3223121219
667 : 1223121219
如果您沒有得到相同的輸出,請告訴我,我們將從那里開始。
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 :
在腳本中 > 你的腳本示例代碼 =D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.