欢迎各位兄弟 发布技术文章
这里的技术是共享的
linux if [ -s file ] 详解
if [ -s file ]
详解if [ -s file ]
是 Linux/Unix shell 脚本中用于检查文件是否存在且大小大于零的一个条件测试表达式。下面我将详细解释这个语法。
bashif [ -s file ]; then # 如果文件存在且大小大于0,执行这里的代码 else # 如果文件不存在或大小为0,执行这里的代码 fi
-s
选项的含义-s
是 shell 测试表达式中的一个文件测试运算符,它有两层含义:
检查指定的文件是否存在
检查文件大小是否大于0字节
只有当这两个条件都满足时,[ -s file ]
才会返回真(退出状态码为0)。
-e file
: 仅检查文件是否存在(不关心大小)
-f file
: 检查文件是否存在且是常规文件(不是目录或设备文件)
-s file
: 检查文件是否存在且大小大于0
bashif [ -s "/var/log/syslog" ]; then echo "系统日志文件存在且不为空" else echo "系统日志文件不存在或为空" fi
bashfilename="/tmp/data.txt" if [ -s "$filename" ]; then echo "$filename 存在且包含数据" fi
bashlogfile="app.log" if [ ! -s "$logfile" ]; then echo "日志文件为空,删除它" rm "$logfile" fi
引号使用:如果文件名包含空格或特殊字符,应该使用引号包裹变量
bash# 正确 if [ -s "$filename" ]; then # 错误(文件名有空格时会出问题) if [ -s $filename ]; then
符号链接:-s
会检查符号链接指向的实际文件
性能考虑:这个检查非常简单快速,因为它只读取文件的元数据而不读取文件内容
Bash 扩展语法:在 Bash 中,也可以使用双方括号 [[ ]]
,它支持更多特性但可移植性稍差
在现代 Bash 脚本中,也可以使用以下等效写法:
bashif [[ -s $file ]]; then # ... fi
或者使用 test 命令:
bashif test -s "$file"; then # ... fi
这三种形式在功能上是等价的。
-s 是什么简写
在 Linux shell 测试表达式(test
或 [ ]
命令)中,-s
并不是某个单词的缩写,而是直接表示 "size"(大小) 的意思。
-s
的含义:-s file
检查文件是否存在且大小 > 0 字节
如果文件存在且非空(有数据),返回 真(0)
否则(文件不存在或大小为 0),返回 假(非 0)
-s
而不是 -n
(like -n
for non-empty string)?-n
在字符串测试中表示 "non-empty"(非空字符串),如 [ -n "$var" ]
但文件测试运算符使用 -s
,可能是为了 避免混淆(字符串测试和文件测试不同)
-s
的常见用法:bashif [ -s "data.txt" ]; then echo "文件存在且不为空" else echo "文件不存在/大小为0" fi
选项 | 含义 | 示例 |
---|---|---|
-e | 文件/目录是否存在 | [ -e file ] |
-f | 是普通文件(非目录/设备) | [ -f file ] |
-d | 是目录 | [ -d dir ] |
-s | 文件存在且大小 > 0 | [ -s file ] |
-z | 字符串长度为0(不同!) | [ -z "$str" ] |
-s
表示 "size"(文件大小 > 0),不是某个单词的缩写
仅用于文件测试(字符串是否为空用 [ -z "$str" ]
或 [ -n "$str" ]
)