【问题标题】:Bash script for downloading files with Curl用于使用 Curl 下载文件的 Bash 脚本
【发布时间】:2010-11-29 12:06:43
【问题描述】:

我正在尝试拼凑一个用于下载文件的小批处理脚本,该脚本将 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 的输入,而不是将输出文件名视为字符串文字。

这里的正确语法是什么?

【问题讨论】:

    标签: bash curl download sed


    【解决方案1】:

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

    在 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
    

    【讨论】:

    • 现在正在阅读 bash 中的引用参数。感谢您的提示
    • 感谢您对此进行扩展。烦人的是,我需要测试它的机器刚刚失去了网络连接,但我相信你,这对我来说很有意义。出于好奇,您的版本中参数编号周围的大括号有何意义?
    • 这就是我被教导扩展 shell 变量的方式。我认为这只是为了让您可以从任何其他文本中消除变量的歧义,如果您想将它们插入到字符串中。例如富=富; echo "${FOO}d" 将打印“食物”
    • 反引号是怎么回事?您真的想从curl 获取输出,对其进行字符串拆分,然后将其作为命令运行吗?
    • 我只是把它们放在了 eval 的位置上,我猜?那是六年前的事了。答案的有用部分是变量引用。
    【解决方案2】:

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

    回声 $2 | sed 的: :\\\ :g '

    我通常避免在 sed 分隔符中使用反斜杠,因为它们很容易混淆。

    【讨论】:

      【解决方案3】:
      curl -# -C - -o "$2" $1
      

      【讨论】:

        【解决方案4】:

        我同意 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
        

        【讨论】:

        • 有罪!我已经扩展了我的答案,包括工作“改进”的例子。
        • 这里仍然有错误的引用。 -o "$filename" "$1"eval 纯粹是安全漏洞(如果你的 URL 包含 $(rm -rf ~) 怎么办?)
        猜你喜欢
        • 1970-01-01
        • 2016-05-27
        • 2015-06-16
        • 2014-06-21
        • 2015-05-25
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 2017-10-08
        相关资源
        最近更新 更多