bash - bash 中的空模式有不同的处理方式吗?

标签 bash

我正在尝试编写一个脚本来解压缩当前目录中的所有文件,如下所示。 这个简单的循环扩展 *.zip,并解压缩每个 f

for f in *.zip
do 
    unzip -o $f 
done

但是,当 *.zip 模式为空时,即当前目录中没有 zip 文件时,我收到错误:

unzip:  cannot find or open *.zip, *.zip.zip or *.zip.ZIP.

我不明白为什么 bash 在模式为空时会以不同的方式处理它。在我看来,模式 *.zip 当为空时被视为字符串文字,当非空时被视为正确的模式。

我的问题是,如何修复脚本以便它也可以处理空模式?

谢谢

最佳答案

最简单的方法是shopt -s nullglob。如果没有找到文件,那么 bash 会将 *.foo 扩展为空。不过,这个 shell 选项是一个 bashism,所以替代方法是检查该值是否实际上是一个文件:

#!/bin/sh

for f in *.zip; do
    [ -f "$f" ] && unzip -o "$f"
done

关于bash - bash 中的空模式有不同的处理方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26226717/

相关文章:

linux - 调用脚本文件时如何提示建议

linux - 获取不存在文件的数量

将程序从 c 转换为 bash 脚本

bash - 如何在 bash 中的特定位置搜索包含数字的文件名

linux - 如何在 bash for 循环中使用变量

linux - 递归地将所有文件分类为单个文件

python - 操作系统调用给予权限被拒绝

bash - 将完整的 make 输出重定向到文件

linux - Bash(并行等待执行)

linux - 如何删除文本文件中带有模式的单词