2016-04-17 3 views
0

Ich versuche, Daten entweder aus einer Datei oder von der Benutzereingabe einzulesen, um es in einem Bash-Shell-Skript zu verarbeiten. Ich bin sehr neu und ich habe diesen Code so weit, wenn das Skript eine Datei als Argument akzeptiert. Wenn ich versuche, eine neue Datei zu erstellen, die ich die Eingaben des Benutzers lesen und verarbeiten kann, löst es einen Fehler aus: $ datafilepath mehrdeutige Umleitung. Ich fühle mich sehr nahe dran, aber vielleicht fehlt mir eine gute Syntax. Kann mich jemand in die richtige Richtung drängen? Vielen Dank!Umleitung stdin wirft ambigous redirect error

#!/bin/bash 
if [ "$#" = "1" ] 
then 
    cat >>"$datafilepath" 
elif [ "$#" = "2" ] 
then 
    datafilepath=$2 
fi 

echo Average Median 
while read myLine 
do 
    sum=0 
    med=0 
    for word in $myLine 
     do 
      sum=`expr $sum + $word` 
      echo -e $word >> medfile 
     done 

sort <medfile>sorted 
cat sorted | tr '\n' '\t' > rowfile 
printf "%.0f\t%.0f\n" $(echo "scale=2; $sum/5" | bc) $(cut -d' ' -f3 rowfile) 
rm -f medfile 
rm -f sorted 
rm -f rowfile 
done <$datafilepath 
+1

"mehrdeutig Umleitung" bedeutet '$ datafilepath' leer. (letzte Zeile des Skripts) – jandob

+0

In der zweiten Zeile 'set -x' einfügen und das Skript erneut ausführen. Bash wird die Debugausgabe ausgeben. –

+0

@jandob Danke für den Hinweis! Wie kommt es, ist es leer, wenn ich Katze >> verwende, so dass es die Benutzereingaben nehmen kann? –

Antwort

1
#!/bin/bash 
if [ "$#" = "1" ] 
then 
    cat >>"$datafilepath" 
elif [ "$#" = "2" ] 
then 
    datafilepath=$2 
fi 

$datafilepath zuerst erscheint in Zeile 4, aber es wurde nicht initialisiert, so dass es leer ist. Die Shell '>>' wird nur angehängt, wenn ein Dateiname existiert. Es muss eine Zeile davor vorhanden sein, die $ datafilepath auf einen Standarddateinamen setzt.

Zeile 2: Die '1' sollte eine '0' sein. Linie # 5: Die '2' sollte eine '1' sein Linie # 7: die '$ 2' sollte ein '$ 1' sein

Dieser Block hat eine unnötige Datei "sortiert":

sort <medfile>sorted 
cat sorted | tr '\n' '\t' > rowfile 
printf "%.0f\t%.0f\n" $(echo "scale=2; $sum/5" | bc) $(cut -d' ' -f3 rowfile) 
rm -f medfile 
rm -f sorted 
rm -f rowfile 

Vorgeschlagene Reduktion:

sort medfile | tr '\n' '\t' > rowfile 
printf "%.0f\t%.0f\n" $(echo "scale=2; $sum/5" | bc) $(cut -d' ' -f3 rowfile) 
rm -f medfile rowfile 
Verwandte Themen