簡體   English   中英

Bash腳本循環通過MySQL

[英]Bash Script Loop Through MySQL

我需要一個可以從遠程數據庫中檢索MySQL數據的bash腳本。 實際上我已經完成了,但我現在需要做的是以某種方式遍歷記錄並將變量傳遞給另一個bash文件。 這是我的MySQL調用:

mysql -X -u $MyUSER -p$MyPASS -h$MyHOST -D$MyDB -e'SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`="1" AND `theme_compiled`='0';' > themes.xml
download_themes.sh

它現在將數據導出到一個名為theme.xml的xml文件中,我只想弄清楚循環數據的方法。 我試圖避免PHP和perl,只是嘗試使用bash。 提前致謝。

就像是:

mysql -e "SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`='1' AND `theme_compiled`='0'" | while read theme_name guid; do
    # use $theme_name and $guid variables
    echo "theme: $theme_name, guid: $guid"
done

簡而言之:當輸出是管道時, mysql命令輸出由'\\ n'分隔的記錄和由'\\ t'分隔的字段。 read命令讀取一行,在字段中拆分,並將每個放在一個變量上。

如果您的數據在字段中有空格,則會出現默認read拆分的問題。 有一些方法可以解決它; 但是如果你只讀兩個字段而其中一個字段不應該有任何空格(比如guid ),那么你可以將'dangerous'字段放在最后, read會把所有''extra'放在最后一個變量中。

像這樣:

mysql -e "SELECT `guid` `theme_name`, FROM `themes` WHERE `theme_purchased`='1' AND `theme_compiled`='0'" | while read guid theme_name; do
    # use $theme_name and $guid variables
    echo "theme: $theme_name, guid: $guid"
done

我建議您只使用SELECT INTO OUTFILE語法或mysql --batch --raw輸出制表符分隔值,而不是輸出XML。 然后,您可以通過bash更輕松地訪問Unix工具鏈的其余部分,例如cutawk以檢索您需要的字段並使用Bash重用它們。 不需要其他腳本語言,您不必亂用XML。

mysql --batch --raw -u $MyUSER -p$MyPASS -h$MyHOST -D$MyDB -e'SELECT `theme_name`, `guid` FROM `themes` WHERE `theme_purchased`="1" AND `theme_compiled`='0';' \
| awk '{print "theme: " $1  " guid: " $2}'

當輸出中有空格時,接受的答案不起作用。 這是一個簡單的修復(IFS = $'\\ t' - 請注意$ - 這很奇怪):


>mysql ... -BNr -e "SELECT 'funny man', 'wonderful' UNION SELECT 'no_space', 'I love spaces';" | while IFS=$'\t' read theme_name guid; do echo "theme: $theme_name guid: $guid"; done
theme: funny man guid: wonderful
theme: no_space guid: I love spaces

當然,您將要替換自己的查詢。

管'|' to while是危險的,因為循環內部的更改發生在另一個子進程中,並且不會在當前腳本中生效。

順便說一句,我討厭轉向外部文件解決方案。

我建議使用“ Process Substitute ”。

while read field1 field2 field3
do
done < <(mysql -NB -e "$sql")
#     ^
#   space needed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM