2017-03-15 2 views
1

J'effectue souvent une requête et je voulais écrire un script bash simple à exécuter. Lorsque je l'ai mis à courir commeFormat de script de requête donnant une fin de fichier inattendue

#!/bin/bash 

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

il fonctionne mais je dois suivre pour configurer la variable dur mac $ et essaie de le mettre à lire un fichier.

Si je le structure comme ceci est il lit du fichier mais fait comme il indique et fait écho chaque fois ainsi j'obtiens un désordre sur l'écran.

#!/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 

Retours

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. 

J'ai essayé cela, mais me donne une fin de fichier inattendue.

#!/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 

Aide pointant vers moi dans la bonne direction pour fixer

Répondre

1

Je ne suis pas familier avec commande dbaccess mais si elle est une commande interactive, vous pouvez l'utiliser comme ceci:

#!/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 

Votre script était presque là. Vous venez de terminer le here-doc avant la fin du fichier.

+0

Merci, cela a fait l'affaire! Et merci pour le lien vers la page de référence. – cw2

+0

Il aurait été possible de conserver l'original '!' En plaçant le '!' Correspondant sur une ligne à part à la fin. J'utilise souvent 'EOF' comme marqueur pour la fin de here-doc (et parfois'! 'Ou EOS ou EOT), mais chacun pour le sien. –

+0

Oui. Je l'ai changé pour le rendre explicite. De plus, les requêtes SQL utilisent parfois! = For not equals, et cela poserait alors problème. – Munir