【问题标题】:Pass string to script将字符串传递给脚本
【发布时间】:2013-04-12 18:56:10
【问题描述】:

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

【问题讨论】:

标签: linux bash


【解决方案1】:

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

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

cat filename | xargs -n 1 ./download

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

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

【讨论】:

    【解决方案2】:

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

    ./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
    

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 2016-09-15
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多