Fehler beim Ausführen des „sed“-Befehls, der Shell-Variablen verwendet

Fehler beim Ausführen des „sed“-Befehls, der Shell-Variablen verwendet

Das hat mich verrückt gemacht ...

Ich möchte Dateien in einem Verzeichnis auflisten und, basierend auf der Nummer, alle Dateien außer der neuesten durchgehen. Hier ist der Codeausschnitt


FILECOUNT=$(ls -lt [dir]*.log | grep -c .log )
for (( c=2; c<=$FILECOUNT; c++ ))
do
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

Ich habe Probleme mit $cder Interpretation, das obige Format funktioniert, aber der sed-Befehl schlägt fehl ... obwohl die Eingabe der letzten Zeile des Protokolls in der CLI wie am Schnürchen läuft


 FILECOUNT=24

 (( c=2 ))

 (( c<=24 ))

C is : 2

 'ls -1t [dir]*.log | sed -n '\''2 p'\'''

 line 41: ls -1t [dir]*.log | sed -n '2 p': No such file or directory

jede Hilfe wäre sehr willkommen!

das [dir]ist offensichtlich ein gültiges Verzeichnis

Antwort1

Ihr Hauptproblem besteht darin, dass Sie bei der Befehlsersetzung alles in Anführungszeichen setzen:

FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")

Dies würde die Shell anweisen, eine ausführbare Datei zu finden mitwörtlicher Name ls -1t [dir]*.log | sed -n '$c p'"und ohne Argumente, im Gegensatz zur Ausführung des Befehls lsmit Optionen -1tund Operanden , dessen Ausgabe an die ausführbare Datei mit Option und Argument [dir]*.logweitergeleitet werden soll . Versuchen Sie, die Anführungszeichen zu entfernen, wie insed-n'$c p'

FILEDIR=$(ls -1t [dir]*.log | sed -n '$c p')

Jedochdann werden Sie mit dem Problem konfrontiert, dass die Variablenerweiterung in Ihrem in einfache Anführungszeichen gesetzten sedBefehl deaktiviert ist.empfohlener Wegbesteht darin, das Argument in einfachen Anführungszeichen aufzubrechen und die Variable in eine Interjektion in doppelten Anführungszeichen zu setzen, wie in

FILEDIR=$(ls -1t [dir]*.log | sed -n "$c"' p')

Außerdem muss ich die obligatorische Warnung aussprechennicht die Ausgabe vonls. ;)

verwandte Informationen