代码之家  ›  专栏  ›  技术社区  ›  Rob Cowell

用于下载curl文件的bash脚本

  •  4
  • Rob Cowell  · 技术社区  · 15 年前

    我正在尝试组合一个小的批处理脚本来下载文件,它以一个URL作为第一个参数,以一个本地文件名作为第二个参数。在测试中,我了解到它在输出文件名中的空格上绊倒了,所以我尝试使用sed来避开它们,但它不起作用。

    #!/bin/bash
    clear
    echo Downloading $1
    echo
    filename=`sed -e "s/ /\\\ /g" $2`
    echo $filename
    echo eval curl -# -C - -o $filename $1
    

    但我明白了

    sed:outfile.txt:没有这样的文件或目录

    这表明它试图将输出文件作为输入加载到sed,而不是将输出文件名作为字符串文字。

    这里正确的语法是什么?

    4 回复  |  直到 9 年前
        1
  •  5
  •   cms    9 年前

    正确引用参数,而不是转换它们可能是更好的方法。

    期望必须在shell脚本的参数中引用空格是很正常的。

    例如

    #!/bin/bash
    clear
    echo Downloading $1
    echo `curl -# -C - -o "${2}" "${1}"`
    

    这样称呼

    ./myscript http://www.foo.com "my file"

    或者,在调用空格时使用'\'来转义空格

    ./myscript http://www.example.com my\ other\ filename\ with\ spaces
    
        2
  •  4
  •   Nick Fortescue    15 年前

    我同意CMS。正确地引用输入参数是更好的样式-您将如何处理下一个问题字符? 以下是更好的。

    curl -# -C - -o "$2" $1
    

    但是,我讨厌人们不回答问题,所以这里有一个答案:—)

    #!/bin/bash
    clear
    echo Downloading $1
    echo
    filename=`echo $2 | sed -e "s/ /\\\ /g"`
    echo $filename
    echo eval curl -# -C - -o $filename $1
    
        3
  •  2
  •   Dennis Williamson    15 年前
    curl -# -C - -o "$2" $1
    
        4
  •  0
  •   sud03r    15 年前

    如果 $2 是文本输入,然后尝试

    echo $2 | sed 's: :\\\ :g '
    

    我通常避免在SED分隔符中使用反斜杠,因为它们非常混乱。