排查从NAS/FTP目录选取指定模式最新文件的Shell脚本错误
脚本问题说明
原有脚本存在的核心问题
- 通配符被错误转义:
[ -f /NAS/"GE_REF_DATA*".txt ]中双引号包裹了通配符*,Shell不会将其作为通配符匹配文件,只会逐字匹配文件名包含*的文件,同时你额外添加的.txt后缀和给出的文件名模式GE_REF_DATA*不符,直接导致路径存在性判断永远为假。 - 判断逻辑不符合需求:你使用
&&要求两个模式的文件必须同时存在才会触发当前路径的逻辑,但需求明确允许仅存在其中一种模式的文件,当前逻辑会漏掉单模式文件存在的场景。 - 执行逻辑混乱:NAS路径匹配成功的分支中,你执行了
cd /FTP的无效操作,且NAS分支没有输出var1、var2的代码,只有FTP分支才有输出,就算NAS路径找到了文件也看不到结果。 - 缺少空匹配处理:如果路径下没有对应模式的文件,
ls -t 模式会输出错误信息,还会把错误内容赋值给变量,需要提前规避。
修正后的可用脚本
#!/bin/bash # 优先检查NAS路径 target_dir="/NAS" # 拉取对应模式最新文件,空匹配时屏蔽错误输出 ref_files=$(ls -t ${target_dir}/GE_REF_DATA* 2>/dev/null | head -n 1) cust_files=$(ls -t ${target_dir}/GE_CUST_DET_DATA* 2>/dev/null | head -n 1) # 如果NAS下两种文件都不存在,再检查FTP if [ -z "$ref_files" ] && [ -z "$cust_files" ]; then target_dir="/FTP" ref_files=$(ls -t ${target_dir}/GE_REF_DATA* 2>/dev/null | head -n 1) cust_files=$(ls -t ${target_dir}/GE_CUST_DET_DATA* 2>/dev/null | head -n 1) fi # 赋值变量,仅保留文件名去除前缀路径 var1=$(basename "$ref_files" 2>/dev/null) var2=$(basename "$cust_files" 2>/dev/null) # 输出结果 if [ -n "$var1" ] || [ -n "$var2" ]; then echo "Files present at ${target_dir}" [ -n "$var1" ] && echo "var1: $var1" [ -n "$var2" ] && echo "var2: $var2" else echo "Files not present anywhere" fi
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

