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

时间:2014-10-07 00:14:22

标签: 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在空时被视为字符串文字,在非空时被视为适当的模式。

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

谢谢,

3 个答案:

答案 0 :(得分:3)

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

#!/bin/sh

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

答案 1 :(得分:1)

当您键入一个不匹配任何内容的通配符模式的命令时,bash和类似的shell通常会保留未扩展的通配符,并始终运行该命令。它是您通过shell编程学会期待的其中一个问题。

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

仅当文件确实存在并且是文件时才解压缩文件。它还具有跳过意外匹配模式的目录的好处。

答案 2 :(得分:0)

我这样做:

find . -maxdepth 1 -name '*.zip' -execdir unzip -o {} +