【发布时间】:2015-02-24 15:56:33
【问题描述】:
我正在编写一个 bash 脚本来检查一个 ftp 站点,看看上面是否存在一些文件。它通过使用 curl 循环遍历文件数组来检查文件是否存在于 ftp 服务器上。如果它没有,那么 curl 应该输出一个错误,我在我的 if 循环中寻找它并基于它回显一个结果。代码如下:
#!/bin/bash
# script variables
ftpaddress=ftpaddress
ftplocation=folderlocation
ftpusername=ftpusername
ftppassword=ftppassword
err="curl: (19) Given file does not exist"
# Initialise array of files
files=( "file1.xml" "file2.xml" "zy.xml" )
for f in "${files[@]}"; do
result=(curl ftp://$ftpaddress$ftplocation$f --user $ftpusername:$ftppassword --head)
if [[ "$result" == "$err" ]]; then
echo $f " Does not exist!!!!"
else
echo $f "Exists"
fi
done
关于 if 循环的某些事情失败了,我尝试了很多变体,但一直找不到有效的变体。目前结果永远不会匹配错误。当我仅从命令行运行 curl 时,如果文件不存在,它会输出我设置为 $err 的错误,但是在运行脚本时,每次说文件确实存在时都会选择 else 分支。我什至尝试将错误设置为*"19"*,但它仍然不匹配。我花了很多时间来查找和测试它,但没有运气,所以如果能提供任何帮助,我将不胜感激。
谢谢
【问题讨论】:
-
认真使用wget而不是curl,如果失败,wget会返回错误状态(在$?)。
-
您的 echo 语句应该在引号内包含 $f,以防文件名以
-e或-n等开头...通常在引号之外的任何地方使用“$”一个 shell 注入攻击的邀请。 -
@Jasen Quotes 本身并不能帮助解决争论。
echo "-n" foo仍将-n视为参数。如果变量是-n something,它确实会有所帮助,但可以避免分词。 -
oops 应该发现了这一点,非常感谢 Jasen。我将看看使用 wget 代替。
-
@EtanReisner 在 echo 之后引用所有内容:
echo "-n foo"
标签: bash if-statement curl ftp