【发布时间】:2019-07-03 13:12:56
【问题描述】:
我想检查一个文件是否是一个文件并且存在以及它是否不为空,所以最终使用-f 和-s 的组合检查。如果文件不存在或为空,我想提前返回,所以我否定这两项检查。
为了测试我的文件名返回空字符串并且我将路径传递到目录的情况,我正在尝试这样做:
if [[ ! -f "/path/to/dir/" ]] && [[ ! -s "/path/to/dir/" ]];
then echo "Does not exists"; else echo "Exists"; fi
存在
Above 返回 'Exist' 似乎不正确。
-f单独检查是正确的:
if [[ ! -f "/path/to/dir/" ]]; then echo "Does not exists";
else echo "Exists"; fi
不存在
合并检查但不否定每个检查也是正确的:
if [[ -f "/path/to/dir/" ]] && [[ -s "/path/to/dir/" ]];
then echo "Exists"; else echo "Does not exists"; fi
不存在
不确定在将否定条件与逻辑和 && 结合使用时,我是否做错了什么,或者 Bash 中是否有一些奇怪之处?
编辑 1: 正如建议的那样,尝试使用两个条件都在同一组括号中的符号:
if [[ ! -f "/opt/gmdemea/smartmap_V2/maps/" && ! -s "/opt/gmdemea/smartmap_V2/maps/" ]]; then echo "Does not exists"; else echo "Exists"; fi
存在
但这不会改变行为。
编辑 2:
从手册页看来,在这种情况下-s 应该足够了,但是当传递现有目录路径时,它返回 true(Bash 版本:4.1.2(1)-release):
if [[ -s "/opt/gmdemea/smartmap_V2/maps/" ]]; then echo "Exists"; else echo "Does not exists"; fi
存在
它在不是文件时返回“存在”,所以应该去 else 子句返回“不存在”
【问题讨论】:
-
请阅读De Morgan's law。
-
对于目录,您可能应该使用
if [[ ! -d "/path/to/dir/" ]]。