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