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-dump
und“ 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.