2009-10-28 27 views
31

我需要一個變量來保存從數據庫中檢索到的結果。到目前爲止,這基本上是我嘗試沒有成功的。bash腳本 - 從數據庫中選擇到變量中

myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a) 

我對bash命令的理解不是很好,你可以看到。

回答

33

我不知道很多關於MySQL命令行界面,但假設你只需要與撲幫助,你應該嘗試要麼換周圍的命令,像這樣:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password) 

其回聲串到MySQL中。或者,你可以更花哨和使用一些新的bash的特性(這裏的字符串)

myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a") 

導致同樣的事情(假設你使用的是最新的bash足夠版本),不涉及回聲。

請注意,-p $密碼不是拼寫錯誤,而是MySQL希望通過命令行輸入密碼的方式(選項和值之間沒有空格)。

請注意,myvariable將包含標準輸出(通常是除錯誤消息之外的所有內容)的MySQL輸出的所有內容,包括任何和所有列標題,ASCII藝術框架等等,這些可能或可能不是您想要的。

編輯:
正如已指出的,似乎是一個-e參數到MySQL,我會去那一個,肯定。

+0

謝謝,mysql命令也不喜歡-p ..我需要使用--password = $ password。 – imnotneo 2009-10-28 13:29:09

+1

您也可以將配置文件(稱爲.my.cnf)添加到您的主文件夾,該文件夾將自動插入您的選項。這可以節省您的腳本 – Yitzchak 2011-09-14 20:34:30

+0

+1 .my.cnf中的一些混淆 - 特別是從腳本中獲取密碼。 -N選項可用於修剪字段名稱。 – ErichBSchulz 2014-01-19 02:49:36

12

你必須在管道周圍的其他方式,你需要呼應查詢,例如:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password) 

另一種方法是隻使用mysql客戶端,這樣

myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a") 

(需要-s以避免ASCII-art)

現在,BASH並不是處理這種類型場景的最合適的語言,尤其是處理字符串a nd分裂SQL結果等。你必須努力工作才能在Perl,Python或PHP中獲得非常簡單的事情。

例如,你將如何獲得A,B和C各自的變量?這當然是可行的,但是如果你不懂管道和echo(非常基本的shell),那麼你做這件事並不是一件容易的事情,所以如果可能的話我會使用更適合的語言。

44

更直接的方法是:

myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a") 
+5

我正在搜索s參數,儘管您需要提供兩次以抑制要打印的列名稱 – 2014-04-20 10:08:57

+0

這應該是最好的答案,它不會返回列名! – user3479125 2015-06-05 09:51:49

+1

我認爲必須刪除'-p'和密碼之間的空格。 – frb 2015-10-02 11:04:27

14

讀取數據線,由線到Bash的數組,你可以這樣做:

while read -a row 
do 
    echo "..${row[0]}..${row[1]}..${row[2]}.." 
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 

或進入各個變量:

while read a b c 
do 
    echo "..${a}..${b}..${c}.." 
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password) 
+0

'語法錯誤附近的意外令牌'<' cut.sh:第26行:'done <<' – thevoipman 2015-07-20 09:28:18

+0

@thevoipman:很可能您的腳本沒有使用Bash。你的朋友說什麼?另外,由於我看不到您的腳本,因此我無法看到錯誤可能在哪裏。 – 2015-07-20 11:42:43

+0

@thevoipman進程替換似乎是你的問題(是的,我知道,一年前,如果有人看到),但也許可以使用管道而不是在你使用的任何shell中進行反向操作,即'回聲... | mysql ... |而讀-a行;做...; done'。請記住,while body是在一個子shell中,並不會影響它周圍的外殼。 – falstro 2016-10-10 18:19:56

3
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a) 

沒有之後的空白。它微不足道,但沒有工作。

0
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT 
    use databaseName; 
    SELECT fieldName FROM tablename WHERE filedName='fieldValue'; 
QUERY_INPUT 
) 
echo "myvariable=$myvariable" 
+0

當提供解決問題的代碼時,最好也至少簡單說明它是如何工作的,以便人們閱讀時不必從頭到尾思路分析,以瞭解差異。 – Fluffeh 2012-09-28 09:11:29

5

如果你想使用bash中使用單個值:

companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1) 

    echo "$companyid" 
+0

這確實將單個值讀入變量 – bebbo 2016-02-08 14:54:40

0

當表名或數據庫包含不受支持的字符,如空間,或又如「 - 」

db='data-base' 

db_d='' 
db_d+='`' 
db_d+=$db 
db_d+='`' 

myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"` 
0

如果您有特定的數據庫名稱和要在其上執行查詢的主機,請按照以下查詢:

outputofquery = $(mysql -u「$ dbusername」-p「$ dbpassword」-h「$ dbhostname」-e「SELECT A,B,C FROM table_a;」$ dbname)

因此,要運行mysql查詢你需要在linux上安裝mysql客戶端