即使文件存在且不为空,也始终给出 false

  • 本文关键字:false 文件 存在 bash
  • 更新时间 :
  • 英文 :


我有一个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 testman 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,还查找:

  1. 目录
  2. 符号链接
  3. 块专用装置
  4. 字符设备
  5. Unix 套接字(本地域套接字)
  6. 命名管道

相关内容

  • 没有找到相关文章

最新更新