欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

linux if [ -s file ] 详解 AG chatgpt 有大用 有大大用

linux  if [ -s file  ]   详解


Linux 中 if [ -s file ] 详解

if [ -s file ] 是 Linux/Unix shell 脚本中用于检查文件是否存在且大小大于零的一个条件测试表达式。下面我将详细解释这个语法。

基本语法

bash
if [ -s file ]; then    # 如果文件存在且大小大于0,执行这里的代码 else    # 如果文件不存在或大小为0,执行这里的代码 fi

-s 选项的含义

-s 是 shell 测试表达式中的一个文件测试运算符,它有两层含义:

  1. 检查指定的文件是否存在

  2. 检查文件大小是否大于0字节

只有当这两个条件都满足时,[ -s file ] 才会返回真(退出状态码为0)。

与其他文件测试运算符的比较

  • -e file: 仅检查文件是否存在(不关心大小)

  • -f file: 检查文件是否存在且是常规文件(不是目录或设备文件)

  • -s file: 检查文件是否存在且大小大于0

使用示例

示例1:基本用法

bash
if [ -s "/var/log/syslog" ]; then    echo "系统日志文件存在且不为空" else    echo "系统日志文件不存在或为空" fi

示例2:检查变量指定的文件

bash
filename="/tmp/data.txt" if [ -s "$filename" ]; then    echo "$filename 存在且包含数据" fi

示例3:结合文件删除操作

bash
logfile="app.log" if [ ! -s "$logfile" ]; then    echo "日志文件为空,删除它"    rm "$logfile" fi

注意事项

  1. 引号使用:如果文件名包含空格或特殊字符,应该使用引号包裹变量

    bash
    # 正确 if [ -s "$filename" ]; then # 错误(文件名有空格时会出问题) if [ -s $filename ]; then
  2. 符号链接-s 会检查符号链接指向的实际文件

  3. 性能考虑:这个检查非常简单快速,因为它只读取文件的元数据而不读取文件内容

  4. Bash 扩展语法:在 Bash 中,也可以使用双方括号 [[ ]],它支持更多特性但可移植性稍差

替代写法

在现代 Bash 脚本中,也可以使用以下等效写法:

bash
if [[ -s $file ]]; then    # ... fi

或者使用 test 命令:

bash
if 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 的常见用法:

bash
if [ -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" ]



普通分类: