我知道[ -f file ]
,如果我们将其用作条件检查,则检查 file 是否是普通文件,而不是目录或特殊文件;如果是,则条件变为真。
我也知道[ -e file ]
检查文件是否存在;即使 file 是目录也是如此。
假设我有以下代码(保存为test.sh
),用于检查其是否为常规文件:
#!/bin/bash
file=$1
if [ -e $file ]
then
echo "file exists"
if [ -f $file ]
then
echo "It's a regular file"
else
echo "It's not a regular file"
fi
else
echo "file doesn't exist"
fi
我正在跑步,如下所示:
./test.sh /etc/passwd
我的输出如下所示:
file exists
Its a regular file
如果我将无效的文件或目录作为参数传递:
./test.sh dsdsafds
仍然保持预期的输出:
file doesn't exist
但是如果我运行的脚本没有任何参数,(意味着$1
将为空):
./test.sh
两个if
条件都得到满足,我的输出是:
file exists
Its a regular file
为什么会这样?即使$1
为空,[ -e file ]
和[ -f file ]
如何为真?
我可以输出/打印这样的测试运算符返回的布尔值吗?
答案 0 :(得分:4)
因为当[ -f $file ]
为null时[ -f ]
变成$file
,所以表达式始终为true,因为-f
不是空字符串。来自man bash
:
test
和[
使用一组基于参数数量的规则来评估条件表达式。0个参数
表达式为假。1个参数
仅当参数不为null时,表达式为true。2个参数
如果第一个参数为!
,则当且仅当第二个参数为null时,表达式才为true。 如果第一个参数是上面CONDITIONAL EXPRESSIONS下列出的一元条件运算符之一,则如果一元检验为true,则表达式为true。如果第一个参数不是有效的一元条件运算符,则表达式为错误。...
因此,引用变量file
可以防止您遇到的错误(例如[ -f "$file" ]
)。
[ ... ] && echo true || echo false