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"。问题是您使用了一对引号,而某些字符串必须单独处理。

相关内容