检查是否存在多个文件 - 使用参数的Unix脚本

时间:2013-11-18 05:17:57

标签: bash unix

我正在尝试编写一个UNIX shell脚本,它将一些文件名作为参数,然后在当前目录中搜索这些文件。

所以我要输入

$ script file1 file2 file3 ...

如果文件名存在,它将以1退出;但是如果文件不存在,它将以状态0结束。

这是我到目前为止所做的:

#!/bin/bash
FILE=$1

if [ -f $FILE ];
then
echo "File $FILE exists."
else
echo "File $FILE does not exist."
fi

但它一次只传递一个文件作为参数。我一次需要多个文件作为参数。

1 个答案:

答案 0 :(得分:4)

问题不完整 - 您想要退出状态1:

  • 如果每个文件都存在,
  • 如果缺少每个文件,
  • 如果至少有一个文件存在,
  • 如果至少缺少一个文件,
  • 或者你还有其他N个M标准吗?

迭代文件名参数的基本技术是:

for file in "$@"
do
    ...body of loop...using "$file" when referring to the file
done

另见How to iterate over the arguments in a bash script


如果您希望每个文件都存在时退出状态为1,则在检测到文件丢失时可以退出状态为0:

for file in "$@"
do
    if [ ! -e "$file" ]
    then echo "$file is missing" >&2; exit 0
    fi
done
exit 1

如果您希望在每个文件丢失时退出状态为1,则在检测到文件存在时可以退出状态为0:

for file in "$@"
do
    if [ -e "$file" ]
    then echo "$file is present" >&2; exit 0
    fi
done
exit 1

如果您希望在至少有一个文件存在时退出状态为1,则在检测到文件存在时可以退出状态1:

for file in "$@"
do
    if [ -e "$file" ]
    then echo "$file is present" >&2; exit 1
    fi
done
exit 0

如果您希望在至少缺少其中一个文件时退出状态为1,则在检测到文件丢失时可以退出状态1:

for file in "$@"
do
    if [ ! -e "$file" ]
    then echo "$file is missing" >&2; exit 1
    fi
done
exit 0

如果您还有其他一些标准,则需要解释它是什么,以及如何将其应用于0,1,2,...... M文件在命令行中指定。

如果要查看每个文件的报告,则需要使用稍微不同的结构。对于最后一种情况,如果缺少至少一个文件,则需要退出状态1,在循环之前将变量status设置为0,并在循环体中将其设置为1(如果条件得到满足,最后退出当前的状态值。

status=0
for file in "$@"
do
    if [ ! -e "$file" ]
    then echo "$file is missing" >&2; status=1
    fi
done
exit $status

其他案件的变化相似;将初始状态设置为默认值,并在检测到相反条件时覆盖默认值。

我使用-e来测试名称是否存在;如果名称必须是普通文件,目录,块或字符特殊设备,符号链接,FIFO或套接字或......,则可以使用其他更具体的测试。

我使用>&2表示法,以便将报告发送到标准错误而不是标准输出。您可能更喜欢使用$0(脚本的名称)为消息添加前缀。您可能更喜欢在标准输出上报告消息。