2017-05-06 7 views
0

Ich bin neu in Linux-Shell-Scripting, ist hier ein Ausschnitt ich verwenden möchte:Shell-Skript "Syntaxfehler:` done 'unerwartet. "

while IFS='' read -r line || [[ -n "$line" ]]; do 
echo "" 
echo "" 
echo "" 
echo "Counting the table : $line" 
eval "hive -e 'select count(*) from $line'" 
done < "$1" 

ich es als count_row.sh nennen. Hier ist die Nutzung:

$ ./count_row.sh t1.csv > row.txt 

t1.csv im Grunde enthält einige Tabelle den Namen jeder Zeile.

Ich habe einen Fehler unter:

syntax error at line 7: `done' unexpected

Aber das Snippet ich hier entlehnt wurde als akzeptierte Lösung markiert, vermutlich wird es richtig geschrieben. Also was fehlt mir hier? Vielen Dank.

+0

Gibt es einen besonderen Grund, warum Sie 'eval' hier verwenden? Es sieht nicht so aus, als wäre es notwendig. – ghoti

+0

Sind Sie sicher, dass Sie den gleichen Code wie in Ihrer Frage ausführen? Ich kopiere es in ein neues Skript auf meiner Maschine und es funktioniert gut. (Ich musste 'hive' nur durch' echo' ersetzen) –

+0

@shambalambala hive ist der Befehl, den ich in Hadoop verwenden muss, um die Abfrage auszuführen und die Zeilenanzahl der Tabelle zu erhalten – PasLeChoix

Antwort

1

Wenn Sie Tabellennamen jeweils in einer eigenen Zeile haben, ist das eine normale Textdatei, kein csv, übrigens.

Versuchen Sie nicht, eval zu verwenden, und führen Sie stattdessen die Anweisung inline aus.

#!/bin/bash 

while IFS= read -r line; do 
    echo "${line}: $(hive -e 'select count(*) from ${line}')" 
done < "$1" 

Wenn Sie Ihr Skript besser testen wollen, würde ich eine for Schleife über eine hartcodierte Liste der Tabellen vor.

Verwandte Themen