我有一个bash脚本:
echo " enter file name "
read $file
if [ -f "$file" ] && [ -s "$file" ]
then
echo " file does not exist, or is empty "
else
echo " file exists and is not empty "
fi
无论我输入什么作为$file
,它都会给我假值。我甚至可以输入一个甚至不存在的文件;它仍然会给我虚假的价值。为什么?
检查-s
就足够了,因为它说:
文件存在且大小大于零
http://unixhelp.ed.ac.uk/CGI/man-cgi?test
此外,您的输出是切换的,因此当文件存在时,它会does not exists
输出,因为-s
会给出TRUE
文件是否存在并且具有size > 0
。
所以正确地你应该使用:
echo " enter file name "
read file
if [ -s "$file" ]
then
echo " file exists and is not empty "
else
echo " file does not exist, or is empty "
fi
这将为您提供预期的输出。
它也应该是
read file
而不是
read $file
如果您想了解更多信息,我建议您阅读man test
和man read
请注意,如果文件存在且不为空,[ -f "$file" ] && [ -s "$file" ]
将返回true
。
其他选项:
if [[ -f "/path/to/file" && -s "/path/to/file" ]]; then
echo "exist and not empty"
else
echo "not exist or empty";
fi
这是真正的解决方案:
if [[ -f $file && -s $file ]]
对于[[
引号是不必要的[[
因为更直观地处理空字符串和带有空格的字符串。
向您提出的解决方案:
if [ -s "$file" ]
是错误的,因为它等效于:
if [[ -e $file && -s $file ]]
除了由单词指示的常规文件外,-f
,还查找:
- 目录
- 符号链接
- 块专用装置
- 字符设备
- Unix 套接字(本地域套接字)
- 命名管道