Скрипт Linux Bash выполняет команду терминала для списка имен файлов

Скрипт Linux Bash выполняет команду терминала для списка имен файлов

У меня есть файл со списком имен файлов, который я пытаюсь использовать в качестве входных данных в определенном инструменте загрузки файлов (sratools), но в моем скрипте возникла проблема.

#!/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"

Команда работоспособна на одном входе, и эхо правильное, но часть команды выдает ошибку

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

Буду признателен, если укажете, где я ошибся!

решение1

Эта линия

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

должно быть

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

Итак, есть четыре слова. Ваша исходная строка была целиком процитирована и интерпретирована как одно слово, имя команды. Поскольку ваше "имя команды" начинается с ./, это должен быть файл или каталог. Но файла или каталога с буквальным именем не существует ./fastq-dump -O ../../DATA_fastQ/ SRR1975008, отсюда и ошибка.

Я процитировал <path_to_tool>/fastq-dumpи <desired_output_directory/на всякий случай, если фактические значения содержат пробелы и/или что-то подобное. Из сообщения об ошибке я могу сказать, что они этого не делают, но в целом они могут.

Очень хорошо, что вы цитируете (например, здесь: done <"$input"). Проблема была в том, что вы использовали одну пару кавычек, когда некоторые строки приходилось обрабатывать отдельно.

Связанный контент