-2

我有一个脚本,download它接受一个字符串并检查文件是否具有字符串的文件名。如果没有,它会下载它。所有文件名都在一个文件中。

此命令不起作用:

cat filenames | ./download

下载源:

filename=$1
if [ ! -f $1 ];
then
        wget -q http://www.example.com/nature/life/${filename}.rdf
fi

示例文件名文件:

file1
file2
file3
file4

如何将 cat 的命令输出传递给下载脚本?

4

2 回答 2

2

在您的脚本$1中是命令行上的位置参数。./download somefile会工作,但cat filename | ./download将数据流式传输到下载中,您忽略它。

您应该阅读高级 bash 脚本编写指南,它将为您提供有关 bash 脚本如何工作的良好基础。要解决此问题,请将您的命令更改为:

cat filename | xargs -n 1 ./download

这将./download针对列表中的每个文件名运行。但是,文件名中可能包含空格或其他特殊字符,这会破坏您的脚本。您应该寻找替代方法来避免这些问题。

具体来说,使用while 循环来读取您的文件。如果将它们正确输入到文件中,这将正确地转义每一行的文件名。这样,您就可以避免 cat 使用以下文件名时遇到的问题:fi/\nle.

于 2013-04-12T19:01:37.950 回答
1

您可以将文件名传递给包含脚本文件名的文件:

./download filenames

然后从文件名中循环文件名$1

$!/bin/bash
# Do sanity check

fname=$1

for f in $(<$fname); do
   if [ ! -f "$f.rdf" ]; then
     wget -q http://www.example.com/nature/life/${f}.rdf
   fi
done
于 2013-04-12T19:00:30.893 回答