Bash 一个if条件中的AND-OR条件
我有3个文件Bash 一个if条件中的AND-OR条件,bash,shell,Bash,Shell,我有3个文件 File1=abc.txt File2=def.txt File3=xyz.txt 如果[-f$File1]&&&[-f$File2]&&&[-f$File3] 然后 #运行一些命令 否则,如果3个文件中的任何一个不存在,它应该告诉我们它是哪个文件。如果有两个文件不存在,那么它应该告诉这两个文件的名称 有人知道怎么做吗?以下脚本的第一个“如果”测试是否缺少一个(或多个)文件。 然后,如果文件丢失,文件上的“for”循环将单独检查每个文件,如果文件丢失,则显示其名称: File1=
File1=abc.txt File2=def.txt File3=xyz.txt
如果[-f$File1]&&&[-f$File2]&&&[-f$File3]
然后
#运行一些命令
否则,如果3个文件中的任何一个不存在,它应该告诉我们它是哪个文件。如果有两个文件不存在,那么它应该告诉这两个文件的名称
有人知道怎么做吗?以下脚本的第一个“如果”测试是否缺少一个(或多个)文件。
然后,如果文件丢失,文件上的“for”循环将单独检查每个文件,如果文件丢失,则显示其名称:
File1=abc.txt File2=def.txt File3=xyz.txt
if [ ! -f "$File1" -o ! -f "$File2" -o ! -f "$File3" ] ; then
# At least one file is missing, writing the list of missing file(s):
echo -n "Missing file(s): "
for i in "$File1" "$File2" "$File3" ; do
if [ ! -f "$i" ] ; then
echo -n "$i "
fi
done
echo
else
echo "No file is missing"
fi
考虑到切普纳下面的评论,一个更便携的版本似乎是:
File1=abc.txt File2=def.txt File3=xyz.txt
if [ ! -f "$File1" ] || [ ! -f "$File2" ] || [ ! -f "$File3" ] ; then
# At least one file is missing, writing the list of missing file(s):
echo -n "Missing file(s): "
for i in "$File1" "$File2" "$File3" ; do
if [ ! -f "$i" ] ; then
echo -n "$i "
fi
done
echo
else
echo "No file is missing"
fi
您可以轻松地将丢失的数据收集到一个数组中,然后从那里获取数据
缺少=()
对于abc.txt def.txt xyz.txt中的文件;做
测试-e“$file”&继续
缺少+=(“$file”)
完成
如果(“${#missing[@]}”==0);然后
#运行一些命令
其他的
回显“$0:缺少:${missing[@]}”>&2
fi
如果你想让它成为一个单行程序,就把它重构成一个函数;对于一个简单的演示,请参见如果条件满足,为什么要从一个
中获得所有这些?不要使用-o
;它是非标准的、模棱两可的、过时的<代码>[…]| |[…]|[…]
是首选。我认为| |和&&用于启动一系列子流程。i、 e:我认为只有当x返回true时,x&&y才会执行y。只有当x返回false时,x | | y才执行y。关于子流程的第一部分是false(您可能将&
与&
混合在一起);但是是的,a | | b
仅在a
失败时才意味着运行b
。因此,if[-f first]|【-f second]
如果存在first
则立即成功,否则检查second
是否存在,并返回该状态。@Jean LoupSabatier他们是;但是您正在为每个比较运行单独的[
命令,而不是将每个表达式的布尔值组合到单个命令中。