2017-03-15 27 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

ありがとう、それはトリックでした!そしてrefページへのリンクをありがとう。 – cw2

+0

マッチする '!'を最後の行に置いてオリジナルの '!'を残すことは可能でしょう。私はしばしば、ここでは '!'やEOSやEOTの終わりのマーカーとして 'EOF'を使用しますが、それぞれ独自のものです。 –

+0

はい。私はそれを明示的にするように変更しました。また、SQL照会では、!= =が等しくないために使用されることがあり、問題が発生します。 – Munir

関連する問題