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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:36:05