Bash If条件判断语句错误 所有受试者均匹配首个分支问题求助
问题根因
你的脚本核心错误是误用了整数比较运算符执行字符串匹配逻辑:
- Bash 中
-eq是专属的整数数值比较运算符,仅支持对数字做相等判断 - 你使用的受试者ID是包含字母的字符串(例如
XX001),用-eq比较时Bash会尝试将两边的内容强制转换为整数,非数字内容转换失败后默认取值为0,最终所有ID的比较都会变成0 -eq 0,永远命中第一个if分支,导致所有受试者的预期文件数都被设为4。
修复方案
只需要把所有if判断里的-eq替换为字符串相等判断运算符==即可,修改后的完整逻辑如下:
# SUBJECTS 是拼接好的受试者ID列表 for i in ${SUBJECTS}; do # 不同受试者的文件数量不同,根据ID指定预期文件数 # 第一个if判断匹配到对应ID时,预期文件数设为4 if [[ ${i} == "XX001" ||\ ${i} == "XX002" ||\ ${i} == "XX003" ]]; then NFILES=4 # 匹配到以下ID时,预期文件数设为3 elif [[ ${i} == "XX004" ||\ ${i} == "XX005" ]]; then NFILES=3 # 其余受试者默认预期文件数为5 else NFILES=5 fi # 遍历每个受试者的预期文件序号,校验文件是否存在 for j in `seq -w 1 ${NFILES}` ; do # 对应文件不存在时,写入缺失记录到日志 if [ ! -f "${FILEPATH}/FILENAME_${i}_${j}.nii.gz" ]; then echo "${i}; FILE ${j}" >> ${FILEPATH}/MissingFiles.txt fi done done
可选优化
如果后续需要匹配的ID数量较多,写大量||判断会比较冗余,你可以用Bash关联数组提前存储ID和对应预期文件数的映射,逻辑更清晰也更易维护:
# 提前定义ID和对应预期文件数的映射 declare -A expected_files=( ["XX001"]=4 ["XX002"]=4 ["XX003"]=4 ["XX004"]=3 ["XX005"]=3 ) # 其余ID默认预期文件数为5 DEFAULT_FILES=5 for i in ${SUBJECTS}; do # 查找ID对应的值,不存在则用默认值 NFILES=${expected_files[${i}]:-${DEFAULT_FILES}} # 后续文件校验逻辑保持不变即可 ... done
内容的提问来源于stack exchange,提问作者William Mitchell
相关产品推荐
相关产品推荐

