我正在尝试将一个小批量脚本拼凑起来下载文件,它将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,而不是将输出文件名视为字符串文字。
这里的语法是什么?
答案 0 :(得分:5)
正确引用参数,而不是转换它们可能是一种更好的方法
期望必须在shell脚本的参数中引用空格
是很正常的e.g。
#!/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
答案 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
答案 2 :(得分:2)
curl -# -C - -o "$2" $1
答案 3 :(得分:0)
如果$2
是文字输入,请尝试
echo $2 | sed 's: :\\\ :g '
我通常避免在sed分隔符中使用反斜杠,因为它们非常混乱。