UNIX Shell脚本异常:else分支未执行且文件空时判断错误
解决Shell脚本条件判断的两个问题
我来帮你搞定这个脚本的问题!你遇到的两个问题——else分支不执行、空文件被误判为不存在,根源主要在路径解析和逻辑顺序上,下面给你详细说明和修正方案:
问题根源分析
变量未加引号导致路径解析错误:
你的脚本中直接使用${rep_import}/file_name.txt,如果rep_import的路径包含空格或特殊字符(比如/tmp/mon dossier),Shell会把这个路径拆分成多个部分,导致-f检查的是错误的路径,误以为文件不存在,进而触发“n'existe pas”的提示。逻辑顺序不够直观(虽理论正确但易出错):
原脚本先判断“存在且非空”,再判断“不存在”,最后else分支处理空文件。这个逻辑本身没问题,但如果路径解析出错,就会跳过else分支,进入错误的elif分支。调整顺序后能避免这类隐性问题。
修正后的脚本
我把脚本改成了更清晰、更健壮的版本:
# 先把文件路径存到变量里,既方便复用又提升可读性 chemin_fichier="${rep_import}/file_name.txt" if [[ ! -f "$chemin_fichier" ]]; then ecrit_trace "Le fichier file_name.txt n'existe pas " elif [[ -s "$chemin_fichier" ]]; then ecrit_trace "Le fichier file_name.txt existe et non vide " else ecrit_trace "Le fichier file_name.txt est vide" fi
关键修正点说明
- 给变量加双引号:所有用到文件路径的地方都用
"$chemin_fichier",确保Shell将整个路径视为一个整体,不管里面有没有空格或特殊字符,都能正确解析。 - 调整判断顺序:先检查文件是否不存在,处理完这个情况后,再判断文件是否非空,最后剩下的自然就是“存在但为空”的情况,逻辑更直观,也更容易排查问题。
为什么原脚本会出错?
举个例子,如果rep_import的值是/dossier avec espace,原脚本里的${rep_import}/file_name.txt会被Shell拆成/dossier和avec/espace/file_name.txt,此时-f检查的是/dossier(这显然不是你的目标文件),所以! -f会返回true,触发“文件不存在”的提示,而实际上你的文件是存在的,只是路径被拆错了。
内容的提问来源于stack exchange,提问作者YounessGI
相关产品推荐
相关产品推荐

