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    ^

つまり、4 つの単語があります。元の行は全体として引用され、1 つの単語、つまりコマンド名として解釈されました。「コマンド名」は で始まっているので./、ファイルまたはディレクトリである必要があります。しかし、リテラル名 を持つファイルまたはディレクトリは存在しない./fastq-dump -O ../../DATA_fastQ/ SRR1975008ため、エラーが発生します。

<path_to_tool>/fastq-dump念のため、<desired_output_directory/実際の値にはスペースなどが含まれていることを前提として引用しました。エラー メッセージからは含まれていないことがわかりますが、一般的には含まれている可能性があります。

引用符を使用するのはとても良いことです (例: done <"$input")。問題は、特定の文字列を個別に処理する必要がある場所で 1 組の引用符を使用したことです。

関連情報