[英]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工具鏈的其余部分,例如cut
和awk
以檢索您需要的字段並使用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.