Bash脚本文件存在性判断无输出问题求助
Bash脚本文件存在判断无输出问题排查
问题描述
编写的Bash脚本用于判断指定目录下的GFS系列文件是否存在,并返回对应的天数,但实际存在GFS_72文件时,脚本未输出预期的3 days,无任何输出。
问题代码
#!/bin/bash FECHA=$(date +%Y-%m-%d) FECHAD=$(date +%d) FECHAM=$(date +%m) FECHAA=$(date +%Y) DIRECTORY="/home/usuario/Build_WRF/DATA/" FILE1=$DIRECTORY"GFS_24" FILE2=$DIRECTORY"GFS_48" FILE3=$DIRECTORY"GFS_72" FILE4=$DIRECTORY"GFS_96" FILE5=$DIRECTORY"GFS_120" FILE6=$DIRECTORY"GFS_144" FILE7=$DIRECTORY"GFS_168" FILE8=$DIRECTORY"GFS_192" FILE9=$DIRECTORY"GFS_216" FILE10=$DIRECTORY"GFS_240" if [ -f $FILE10 ]; then dias="10 days" echo $dias elif [ -f $FILE9 ]; then dias="9 days" echo $dias elif [ -f $FILE8 ]; then dias="8 days" echo $dias elif [ -f $FILE7 ]; then dias="7 days" echo $dias elif [ -f $FILE6 ]; then dias="6 days" echo $dias elif [ -f $FILE5 ]; then dias="5 days" echo $dias elif [ -f $FILE4 ]; then dias="4 days" echo $dias elif [ -f $FILE3 ]; then dias="3 days" echo $dias elif [ -f $FILE2 ]; then dias="2 days" echo $dias elif [ -f $FILE1 ]; then dias="1 day" echo $dias else exit fi FECHAF=$(date +%Y-%m-%d --date="$dias") FECHAFD=$(date +%d --date="$dias") FECHAFM=$(date +%m --date="$dias") FECHAFA=$(date +%Y --date="$dias")
问题原因分析
- 逻辑优先级问题:脚本从最大的
FILE10开始向下判断,如果FILE4到FILE10中任意一个文件实际存在,脚本会优先匹配该分支,不会走到FILE3的判断。需确认是否只有GFS_72存在,更大的GFS文件(如GFS_96、GFS_120等)不存在。 - 路径或文件名错误:需验证
DIRECTORY路径是否正确(比如usuario是否为当前实际用户名),实际文件名是否与脚本中的GFS_72完全一致(包括大小写、有无后缀)。 - 权限不足:脚本运行用户没有
/home/usuario/Build_WRF/DATA/目录的读取权限,导致[ -f $FILE3 ]判断返回假。 - 未进入任何分支:如果所有文件判断都不成立,脚本会执行
else分支直接exit,无任何输出。
解决方法
1. 添加调试输出定位问题
在每个判断分支中添加调试语句,确认脚本是否走到目标分支:
elif [ -f $FILE3 ]; then echo "Debug: Found file $FILE3" dias="3 days" echo $dias
同时在脚本开头添加路径验证:
echo "Debug: Checking directory $DIRECTORY" echo "Debug: Target file path $FILE3"
2. 验证文件存在性与权限
在终端中执行以下命令,确认文件存在且有读取权限:
ls -l /home/usuario/Build_WRF/DATA/GFS_72
如果提示权限不足,需调整目录或文件权限,或使用有对应权限的用户运行脚本。
3. 优化脚本逻辑(简化代码,减少出错概率)
用循环替代重复的if-elif,逻辑更清晰且易维护:
#!/bin/bash DIRECTORY="/home/usuario/Build_WRF/DATA/" dias="" # 从10天到1天遍历检查 for days in {10..1}; do hours=$((days * 24)) FILE="${DIRECTORY}GFS_${hours}" if [ -f "$FILE" ]; then if [ $days -eq 1 ]; then dias="1 day" else dias="${days} days" fi echo "$dias" break fi done # 未找到文件则退出 if [ -z "$dias" ]; then exit 1 fi FECHAF=$(date +%Y-%m-%d --date="$dias") FECHAFD=$(date +%d --date="$dias") FECHAFM=$(date +%m --date="$dias") FECHAFA=$(date +%Y --date="$dias")
内容的提问来源于stack exchange,提问作者CVB
相关产品推荐
相关产品推荐

