Wenn grep im Shell-Skript verwendet wird, wird der Fehler "Datei nicht gefunden" angezeigt

8

Ich kann nicht glauben, dass ich 1,5 Stunden mit etwas so Trivialem verbracht habe. Ich schreibe ein sehr einfaches Shell-Skript, das eine Datei greps, die Ausgabe in einer Variablen speichert und die Variable in STDOUT ausgibt.

Ich habe den Befehl grep mit dem Regex in der Befehlszeile überprüft, und es funktioniert gut. Aus irgendeinem Grund funktioniert der Befehl grep jedoch nicht innerhalb des Shell-Skripts.

Hier ist das Shell-Skript, das ich aufgeschrieben habe:

%Vor%

Ich habe das mit dem folgenden Befehl ausgeführt: ./myScript.sh testingFile . Es druckt nur eine leere Zeile.

  • Ich habe chmod bereits benutzt und das Skript ausführbar gemacht.
  • Ich habe überprüft, dass die Variable PATH /bin enthält.
  • Bestätigt, dass echo $SHELL gibt /bin/bash
  • In meiner Verzweiflung habe ich alle Kombinationen ausprobiert:
    • tt=grep 'test' ""
    • echo ${tt}
    • Das Befehlszeilenargument überhaupt nicht verwenden und den Namen der Datei fest codieren tt=grep 'test' testingFile
  • Ich habe Folgendes gefunden: grep schlägt innerhalb des Bash-Skripts fehl funktioniert aber in der Befehlszeile und verwendete sogar dos2unix , um mögliche Wagenrückläufe zu entfernen.
  • Wenn ich versuche, eine der grep-Optionen zu verwenden, wie zum Beispiel: tt=grep -oE 'test' testingFile , erhalte ich die Fehlermeldung: ./out.sh: line 3: -oE: command not found .
  • Das ist verrückt.
Bonz0 18.10.2013, 10:25
quelle

1 Antwort

13

Sie müssen die Befehlsersetzung verwenden:

%Vor%

Mit der Befehlsersetzung kann die Ausgabe eines Befehls den Befehl selbst ersetzen. Befehlsersetzung tritt auf, wenn ein Befehl wie folgt eingeschlossen ist:

%Vor%

oder wie das mit Backticks:

%Vor%

Bash führt die Erweiterung aus, indem er COMMAND ausführt und die Befehlsersetzung durch die Standardausgabe des Befehls ersetzt, wobei alle nachfolgenden Zeilenumbrüche gelöscht werden. Eingebettete Zeilenumbrüche werden nicht gelöscht, aber sie können während der Worttrennung entfernt werden.

Die $() Version wird normalerweise bevorzugt, da sie das Verschachteln ermöglicht:

%Vor%

Weitere Informationen finden Sie im Abschnitt command substitution in man bash .

    
Chris Seymour 18.10.2013, 10:31
quelle

Tags und Links