2017-03-15 31 views
1

我經常執行某個查詢,並希望編寫一個簡單的bash腳本來運行。當我將它設置爲以下給出文件意外結尾的查詢腳本格式

#!/bin/bash 

dbaccess davedb <<! 2>/dev/null 
set isolation dirty read; 
SELECT cpe_localization_code 
FROM hct_profile 
WHERE hct_mac_address = '$mac'; 

運行它的工作原理,但是我必須努力設置$ MAC變量,我試圖把它從文件中讀取。

如果我像這樣構造它,它會從文件中讀取數據,但是它會每次都顯示和回顯,所以我在屏幕上亂七八糟。

#!/bin/bash 

OLDIFS=$IFS 
IFS="/t" 
file=list.csv 

while read mac; do 

echo "SET isolation dirty read; 
SELECT cpe_localization_code 
FROM hct_profile 
WHERE hct_mac_address = '$mac' 
;" | dbaccess davedb 

done <"$file" 
IFS=$OLDIFS 

返回

Database selected. 


Isolation level set. 



cpe_localization_+ 

82345 

1 row(s) retrieved. 



Database closed. 


Database selected. 


Isolation level set. 



cpe_localization_+ 

82345-1 

1 row(s) retrieved. 



Database closed. 

我試過,但給我的文件的意外結束。

#!/bin/bash 

OLDIFS=$IFS 
IFS="/t" 
file=list.csv 

while read mac; do 

dbaccess davedb <<! 2>/dev/null 
set isolation dirty read; 
SELECT cpe_localization_code 
FROM hct_profile 
WHERE hct_mac_address = '$mac'; 

done <"$file" 
IFS=$OLDIFS 

幫助在正確的方向指向我解決

回答

1

我不熟悉dbaccess命令,但如果它是一個交互式命令,你可以使用它像這樣:

#!/bin/bash 

OLDIFS=$IFS 
IFS="/t" 
file=list.csv 

while read mac; do 

dbaccess davedb <<EndOfQuery 2>/dev/null 
set isolation dirty read; 
SELECT cpe_localization_code 
FROM hct_profile 
WHERE hct_mac_address = '$mac'; 
EndOfQuery 

done <"$file" 
IFS=$OLDIFS 

你的腳本幾乎在那裏。您只需在文件結束之前終止here-doc

+0

謝謝,這個伎倆!並感謝您參考參考頁面的鏈接。 – cw2

+0

通過將匹配的「!!」放在最後一行上,可以保留原來的'!'。我經常使用'EOF'作爲here-doc結尾的標記(有時是'!'或者EOS或者EOT),但是每個都是他們自己的。 –

+0

是的。我改變了它,使其明確。此外,SQL查詢有時使用!=不等於,這會導致問題。 – Munir

相關問題