我正在尝试编写一个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
但它一次只传递一个文件作为参数。我一次需要多个文件作为参数。
答案 0 :(得分:4)
问题不完整 - 您想要退出状态1:
迭代文件名参数的基本技术是:
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
(脚本的名称)为消息添加前缀。您可能更喜欢在标准输出上报告消息。