2015-07-21 70 views
1

如果此問題過於簡潔,但我試圖通過Shell腳本運行MySQL查詢,並希望在結果中查詢幾個不同的「列」,我很抱歉。這一切都運行良好,但我在哪裏掙扎,是要弄清楚我可以如何將這些「列」中的每一個設置爲我的Shell腳本中的唯一變量。這是我的;將MySQL查詢設置爲Shell中的多個變量

#!/bin/sh 

results=$(mysql --host=localhost --user=root --password=root Database --skip-column-names -e 'Select cost1, cost2, cost3 from Customers';) 

someMath() { 
total=$1+$2+$3 
echo $total 
} 

for cost in $results; 
do 
someMath $cost1 $cost2 $cost3 
done 

exit 0 

哪裏奮鬥是要弄清楚我如何能切實將所有查詢結果中的「COST1」的是COST1 $,所有的查詢「cost2」的爲$ cost2,和所有查詢中的「cost3」爲$ cost3。我的計劃是將這些變量提供給另一個函數來執行其他任務。

我知道這可能很簡單,但儘管我搜索了,但我無法弄清楚這一點!謝謝!

+0

你能解釋一下你對這行數據做了什麼,那些行,假設你在腳本中獲得了3行,以後呢?你做的不僅僅是回聲吧? – Drew

+0

嗨@DrewPierce - 是的,我會做的不僅僅是回聲。我將在這個例子中將三個變量提供給另一個shell腳本,該腳本將對數據集進行一些計算。這個例子中的變量只是佔位符;我的真實變量涉及數字和數學。 – ZbadhabitZ

+0

艾倫我可以幫你,但可能不是你想要的確切形式。你可以提供更多的信息在僞代碼高級 – Drew

回答

0

如果我理解正確,你需要每行,每列,並分別傳遞給他們一些其他功能。這裏是我寫的一個例子:

#!/bin/bash 

someListReceiver() { 
    ## you know how many values you pass so you can use $1 $2... 
    ## simple math with bc 
    echo "$1+$2+$3" | bc 
} 

someArrayReceiver() { 
    ## Looping a received array if you don't know how many columns you'll get 
    declare -a arrayArguments=("${!1}") 

    c=0 
    for i in "${arrayArguments[@]}" 
    do 
     let c+=$i 
    done 
    echo $c 
} 

while read line 
do 
    ## IFS is your seperator, you can choose which it is, or you can use default space and us it with CONCAT_WS 
    IFS=$';' 
    for column in $line 
    do 
     ## assign rows each value to an array 
     columnsAr+=($column) 

     ## you can check every column with this 
     ## echo "$column of $line" 
    done 

    ## pass your row list to some function 
    someListReceiver ${columnsAr[@]} 

    ## or pass your array to function 
    someArrayReceiver columnsAr[@] 

    ## unset array to refill 
    unset columnsAr 

done < <(mysql --host=localhost --user=root --password=123 test --skip-column-names -e "SELECT CONCAT_WS(';', cost1, cost2, cost3) FROM customers;") 

不管你喜歡,你可以改變傳遞數組的數據。

+0

我看到你在這裏做什麼!非常感謝@mim,這非常有幫助! – ZbadhabitZ