【问题标题】:Nested if in for loop appears to use all results instead of single one嵌套 if 在 for 循环中似乎使用所有结果而不是单个结果
【发布时间】:2021-03-18 05:37:57
【问题描述】:

我不确定这是curl 问题还是我的代码有问题。 我正在使用curl -T 将目录的内容上传到远程服务器,并且由于curl 没有,根据帮助文件和一些谷歌搜索,如果文件存在,我可以跳过它,我正在尝试围绕它编写脚本。

#!/bin/sh
cd /foo/bar
curl --user foo:bar -ls ftp://ftp.server.foo/remote/dir/ > /foo/bar/temp.txt
for file in ./*.dat
do
    if ! grep -Fq "$file" temp.txt
    then
        curl --user foo:bar -T "$file" ftp://ftp.server.foo/remote/dir/
    fi
done
rm -f /foo/bar/temp.txt

我目前在/foo/bar 中有 6 个文件,这些文件已经上传到远程。我出于测试目的从远程删除了其中一个文件,但所有 6 个文件都重新传输了。

使用上面的代码,只要与 temp.txt 不匹配,curl 就会上传在for 循环中找到的所有文件,无论它是否匹配if 条件。我是否遗漏了一些非常明显的东西,或者这是 curl 的东西,我在 SuperUser 中过得更好?

【问题讨论】:

  • 运行sh -x your.script.sh 时看到了什么?是你grep temp.txt 却创建/foo/bar/temp.txt 的麻烦吗?嗯;你做cd /foo/bar 所以curl 命令重定向中的路径是不必要的。您是否查看过/foo/bar/temp.txt 以查看其中的内容?
  • 对于第一个问题,我看到连续的grep 命令,并且对于每个grep,还有一个curl 调用。但是,由于您的建议,我现在确实注意到 grep 命令正在寻找 ./file1.dat,而不仅仅是 file1.dat - 我将尝试简单地执行 for file in *.dat 并更新您的结果。对于第二个问题,temp.txt 文件包含...file1.datfile2.datfile3.dat 等。
  • 所以现在你知道为什么grep 没有在temp.txt 中找到它正在寻找的名称(文件、字符串),因此它失败并且循环中的curl 命令是为每个文件执行。

标签: linux shell curl sh


【解决方案1】:

感谢Jonathan Leffler 的评论,我通过sh -x script.sh 发现我的for 声明是问题所在。按照我写的方式,它发送./file1.datgrep 以尝试在temp.txt 中查找,其中只有file1.dat没有 ./file1.dat

更改为for file in *.dat,这解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多