You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本退出方法及空文件条件执行问题求助

解决Bash脚本的判断语法错误与退出问题

我来帮你搞定这个问题,你遇到的「缺少']'」错误是个很常见的Bash语法坑,咱们一步步来修正:

首先,修正判断语句的语法错误

你写的[ -s /tmp/tmp_direc_last_update.log]之所以报错,是因为**[(test命令的别名)和]的前后必须加空格**,Bash会把[当作一个独立命令,参数之间必须用空格分隔。正确的写法是:

if [ -s /tmp/tmp_direc_last_update.log ]; then
    # 这里放需要执行的代码
fi

-s选项的作用是检查文件是否存在且大小大于0(也就是非空),完全符合你的需求。

修正后的完整脚本

我还优化了原脚本里的一些小问题(比如变量赋值方式、sed命令的引号问题),最终版本如下:

#!/bin/bash
DATE_TIME=$(date +%s)
# 获取/data下权限为777的目录信息(注:用ls解析输出不是最稳妥的方式,后面会说替代方案)
FILE_OUTPUT=$(ls -l --time-style=long-iso /data | grep drwxrwxrwx | awk '{print $6","$7","$8}')

# 清空临时文件(比rm后再创建更高效)
> /tmp/tmp_direc_last_update.log
# 写入内容到临时文件
echo "$FILE_OUTPUT" > /tmp/tmp_direc_last_update.log

# 判断临时文件是否非空,是则执行后续操作
if [ -s /tmp/tmp_direc_last_update.log ]; then
    # 原地在每行末尾添加当前时间戳
    sed -i "s/$/,${DATE_TIME}/" /tmp/tmp_direc_last_update.log
    # 将内容写入最终统计文件
    cat /tmp/tmp_direc_last_update.log > /data/stats/direc_last_update.log
else
    # 如果文件为空,可选输出提示并退出脚本
    echo "没有符合条件的目录,跳过后续操作"
    # 退出脚本:exit 0表示正常退出,非0值(比如exit 1)表示异常退出
    exit 0
fi

关于Bash脚本的退出方法

在脚本里要退出的话,直接用exit命令就行:

  • exit 0:告诉父进程(比如你的终端)脚本正常完成,返回值0
  • exit 1(或其他非0数字):表示脚本遇到错误退出,不同的数字可以用来区分错误类型(比如权限问题用1,文件不存在用2)
  • 如果只是不想执行后续代码但不退出脚本,也可以不用exit,直接让else分支为空就行

额外优化建议:用find替代ls解析输出

用ls解析文件信息很容易踩坑(比如目录名含空格时,awk的列会乱掉),推荐用find命令来获取符合条件的目录,更稳定:

# 直接输出目录的修改日期、时间、名称,格式和原脚本一致
FILE_OUTPUT=$(find /data -maxdepth 1 -type d -perm 777 -printf "%TY-%Tm-%Td,%TH:%TM,%f\n")

这个命令直接过滤出/data下一级的权限为777的目录,输出格式完全匹配你原来的需求,而且不怕特殊字符。

内容的提问来源于stack exchange,提问作者testymctesterson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:07:34