【问题标题】:bash If statement failingbash If 语句失败
【发布时间】: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


【解决方案1】:

( ) 将为您提供返回值 $( ) 将为您提供标准输出

 result=$(curl ftp://$ftpaddress$ftplocation$f --user $ftpusername:$ftppassword --head 2>&1)

【讨论】:

    猜你喜欢
    • 2018-02-02
    • 2019-01-26
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2013-02-28
    相关资源
    最近更新 更多