将字符串传递给脚本

时间:2013-04-12 18:56:10

标签: linux bash

我有一个脚本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的命令输出传递给下载脚本?

2 个答案:

答案 0 :(得分:2)

在您的脚本$1中是命令行上的位置arg。 ./download somefile可行,但cat filename | ./download会将数据流式传输下载,您可以忽略这些数据。

您应该阅读advanced bash scripting guide,它将为您提供bash脚本工作方式的良好基础。要解决此问题,请将命令更改为:

cat filename | xargs -n 1 ./download

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

具体来说,使用while loop来读取您的文件。如果它们正确输入到文件中,这将正确地转义每行上的文件名。这样,您就可以避免cat对文件名产生的问题,例如:fi/\nle

答案 1 :(得分: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