Linux Bash-Skripting führt einen Terminalbefehl für eine Liste von Dateinamen aus

Linux Bash-Skripting führt einen Terminalbefehl für eine Liste von Dateinamen aus

Ich habe eine Datei mit einer Liste von Dateinamen, die ich als Eingabe in einem bestimmten Datei-Download-Tool (sratools) verwenden möchte, aber mein Skript hat ein Problem

#!/bin/bash
input="<path_to_directory>/SRR_Acc_List.txt"
while IFS= read -r line
do 
    "<path_to_tool>/fastq-dump -O <desired_output_directory/ $line"
    echo "Downloading $line file"
done <"$input"

Der Befehl funktioniert mit einer einzigen Eingabe und das Echo ist korrekt, aber der Befehlsteil gibt den Fehler aus

line 6: ./fastq-dump -O ../../DATA_fastQ/ SRR1975008: No such file or directory

Ich wäre für Hinweise dankbar, wo ich Fehler gemacht habe!

Antwort1

Diese Linie

"<path_to_tool>/fastq-dump -O <desired_output_directory/ $line"

sollte sein

"<path_to_tool>/fastq-dump" -O "<desired_output_directory/" "$line"
#       unquoted spaces    ^  ^     they separate words    ^

also sind es vier Wörter. Ihre ursprüngliche Zeile wurde als Ganzes zitiert und als ein Wort interpretiert, ein Befehlsname. Da Ihr „Befehlsname“ mit beginnt ./, muss es sich um eine Datei oder ein Verzeichnis handeln. Es gibt jedoch keine Datei oder kein Verzeichnis mit dem wörtlichen Namen ./fastq-dump -O ../../DATA_fastQ/ SRR1975008, daher der Fehler.

Ich habe „ <path_to_tool>/fastq-dumpund“ zitiert <desired_output_directory/, nur für den Fall, dass die tatsächlichen Werte Leerzeichen und/oder Ähnliches enthalten. Aus der Fehlermeldung erkenne ich, dass dies nicht der Fall ist, aber im Allgemeinen können sie es.

Es ist sehr gut, dass Sie Anführungszeichen setzen (z. B. hier: done <"$input"). Das Problem war, dass Sie ein Paar Anführungszeichen verwendet haben, wo bestimmte Zeichenfolgen separat behandelt werden mussten.

verwandte Informationen