2017-12-28 2 views
1

mein Skript überprüfen, ob die Argumente Dateien oder Ordner sind Wenn es eine Datei ist, zählt er die Anzahl der Zeilen danach, wenn die Anzahl der Zeilen ist großer dann 20 oder weniger er einige Anweisungen tun das Problem in dieser Anweisung ist n= cat $a | wc -lDie Zeilenanzahl einer Datei in einem Shell-Skript mit wc Fehler

Mein Skript:

#!/usr/bin/env bash 
echo 'Hello this is the test of' `date` 
echo 'arguments number is ' $# 
if [ $# -eq 4 ] 
then 
    for a in [email protected] 
    do 
    if [ -d $a ] 
    then 
     ls $a > /tmp/contenu 
     echo "contenu modified" 
    elif [ -f $a ] 
     then 
#  this instruction must set a numeric value into n 
      echo "my bad instruction" 
      n= cat $a | wc -l 
      echo "number of lines = " $n 
#  using the numeric value in a test (n must be numeric and takes the number of lines in the current file) 
      if [ $n -eq 0 ] 
      then 
       echo "empty file" 
      elif [ $n -gt 20 ] 
      then 
       echo ` head -n 10 $a ` 
      else 
       cat $a 
      fi 
    else 
     echo "no file or directory found" 
    fi 
    done 
else 
echo "args number must be 4" 
fi 

Dies ist die Ausgabe der Ausführung der falschen Anweisung

my bad instruction 
5 
number of lines = 
ExamenEx2.sh: line 19: [: -eq : opérateur unaire attendu 

Antwort

1

Die Zeile n= cat $a | wc -l ist eine anstößige Anweisung. Denken Sie immer daran, dass das Shell-Skript bash die Groß- und Kleinschreibung berücksichtigt. Ihr Befehl wird von der Shell interpretiert als zwei separate Befehle

n= cat $a | wc -l 
#^^ ^^^^^^^^^^^^^^ 
#1   2 

Der erste Teil laufen nur speichert eine leere Zeichenfolge an die variable n und der nächsten druckt die Zeilenzählung in der Datei variable a gespeichert. Beachten Sie, dass die Shell keine Fehler dafür auslöst. Weil es nicht die Syntax verletzt (nur die Semantik ist falsch). Die Zeilenanzahl wird jedoch nie der Variablen n zugewiesen.

Der Fehler tritt auf, wenn die Bedingung if [ $n -eq 0 ] bei einem Vergleich mit einer leeren Variablen auf der LHS-Datei gefunden wird.

Sie wollten einen Befehl ausführen und seine Ausgabe speichern, dafür benötigen Sie die Befehlsersetzung ($(..)). Unter der Annahme der $a enthält einen Namen einer Datei nur noch

n=$(wc -l < "$a") 

Beachten Sie, dass ich die nutzlos cat Nutzung und kochend es wc entfernt haben. Aber wc kann direkt aus einem Eingangsstrom lesen.

Beachten Sie auch, dass Sie mehrere fehlerhafte Vorgehensweisen in Ihrem Skript haben. Denken Sie daran, die folgenden

  1. Immer doppelte Anführungszeichen die Shell-Variablen zu tun - "$#", "[email protected]", [ -f "$a" ], [ -d "$a" ]
  2. Sie das nicht verwenden `` für Kommandosubstitution, weil es nicht leicht nestbarer ist und Sie vielleicht habe auch Probleme mit Zitaten.
  3. Sie bedingter Ausdruck verwenden können [[, wenn Sie sicher sind, ob das Skript unter bash, in dem ausgeführt wird, eine variable Räume enthalten, können ohne Angabe auf der LHS
verwendet werden
Verwandte Themen