【问题标题】:Iterating through files gives odd results when no files [duplicate]当没有文件时,遍历文件会产生奇怪的结果[重复]
【发布时间】:2015-01-27 02:00:50
【问题描述】:

我正在尝试遍历 bash 脚本中的所有 zip 文件(我使用的是 Cygwin,但我有点怀疑这是 Cygwin 的错误)。

现在看起来像这样:

for z in *.zip
do
    echo $z
done

当文件夹中有 zip 文件时效果很好,它会准确地回显 zip 文件,除了 zip 文件什么都没有。但是,当我在一个空的文件夹上执行此操作时,它会回显 *.zip,而我宁愿它什么也不回显。

我该怎么办?我不认为正确的解决方案是if [ $z != "*.zip ]...但是是吗?

【问题讨论】:

    标签: bash cygwin


    【解决方案1】:

    这是预期的行为。来自documentation

    如果没有找到匹配的文件名,并且 shell 选项 nullglob 被禁用,则单词保持不变。如果设置了nullglob 选项,但没有找到匹配项,则删除该单词。

    所以解决方法是在循环前设置nullglob选项:

    shopt -s nullglob
    for z in *.zip
        ...
    

    【讨论】:

      【解决方案2】:

      作为执行命令的步骤之一,shell 可能会执行路径扩展,在这种情况下,它会将字符串(例如*.zip)替换为与该 glob 匹配的文件列表。 如果没有这样的文件,则字符串保持不变。一个合理的解决方案是:

      for z in *.zip
      do
          [ -f "$z" ] && echo $z
      done
      

      [ -f "$z" ] 验证文件是否存在并且是常规文件。 && 表示只有通过该测试才会执行 echo

      【讨论】:

        【解决方案3】:

        或者打开nullglob选项。

        $ set -x
        $ echo *.none
        + echo '*.none'
        *.none
        $ shopt -s nullglob
        + shopt -s nullglob
        $ echo *.none
        $ echo *.none
        + echo
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-15
          • 2023-04-03
          • 2013-03-15
          • 2019-01-11
          • 1970-01-01
          • 2022-01-02
          • 1970-01-01
          • 2015-10-04
          相关资源
          最近更新 更多