Bash Shell测试文件特性

为了提高脚本的稳健性,你希望在读取输入文件前先检查该文件是否存在;另外,还想在写入输出文件前确认其是否具备写权限,在用 cd 切换目录前看看到底有没有这个目录。这些该如何在 bash 脚本中实现呢?

解决方案

在 if 语句的 test 命令部分使用各种文件特性测试。可以使用类似于下例 的脚本来解决你的问题。

#!/usr/bin/env bash
# 实例文件:checkfile
#
DIRPLACE=/tmp
INFILE=/home/yucca/amazing.data
OUTFILE=/home/yucca/more.results

if [ -d "$DIRPLACE" ]
then
    cd $DIRPLACE
    if [ -e "$INFILE" ]
    then
        if [ -w "$OUTFILE" ]
        then
            doscience < "$INFILE" >> "$OUTFILE"
        else
            echo "cannot write to $OUTFILE"
        fi
    else
        echo "cannot read from $INFILE"
    fi
else
    echo "cannot cd into $DIRPLACE"
fi

讨论

我们将各种文件名引用全都放入了引号,以防路径名中包含空格。这个示例并不存在这种情况,但如果修改脚本,使用其他路径名,那可就不一定了。

在测试另外两种条件前,我们先测试并执行了 cd 命令。在这个示例中,测试顺序并不重要,但如果 $INFILE$OUTFILE 中保存的是相对路径(不是以根目录开始,即 / 开头的路径),同样的测试也许在 cd 之前为真,之后为假,反过来也有可能。因此,我们要在使用文件之前测试。

示例用双大于号运算符(>>)将输出追加到结果文件中,而不是用新内容替换原有文件内容。

可以用 -a(读作“and”)运算符将多个测试组合成一个更长的 if 语句,但如果测试失败,你也看不到特别有帮助的错误消息,因为根本就不知道是哪部分测试没有通过。

我们也可以测试一些别的文件特性,其中有 3 个特性要用到双目运算符(接受两个文件名)。

FILE1 -nt FILE2

是否更新(检查文件的修改时间)。现有文件要比不存在的文件“新”。

FILE1 -ot FILE2

是否更旧。同样,不存在的文件要比现有文件“旧”。

FILE1 -ef FILE2

具有相同设备和 inode 编号(即便由不同链接所指向,也视为相同的文件)。

下表 展示了与文件相关的其他测试。表中全都是单目运算符,其形式为 option filename,例如,if [ -e myfile ]

Bash Shell测试文件特性

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!