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

Shell脚本多文件存在性校验逻辑异常排查求助

Shell脚本文件存在性校验问题排查与修正方案

问题背景

需求为:必须确保三个文件(dti_nii_LPS_g_CHECK、dti_bvec_LPS_g_CHECK、dti_bval_LPS_g_CHECK)同时存在,才向CSV库存文件$INVENTORY_FILE的DTI_file_found列写入"Y";若任意一个文件不存在,则写入"N"。当前代码未实现该逻辑,出现部分本该返回"N"的数据点却返回"Y"的错误。

当前代码的问题分析

  1. 校验逻辑缺失:仅检查了dti_nii_LPS_g_CHECK文件的存在性,完全忽略了另外两个关键文件(bvec、bval)的校验,导致只要nii文件存在就写入错误值。
  2. 未定义变量引用:代码中使用了dti_LPS_g_CHECK变量,但该变量从未定义,会导致写入空字符串或意外内容,而非预期的"Y"。
  3. 注释中的语法错误:尝试的三文件校验代码[[[ -f dti_nii_LPS_g_CHECK && ... ]]]存在两处错误:一是多了一个左括号[,二是变量未加$引用,无法正确解析变量值。

修正后的代码

# -- 检查DTI相关文件是否存在,更新DTI_file_found列
dti_nii_LPS_g_CHECK="${GO_TIMROBERTS}/${subjid_g}/${subjid_g}_DWI_30dir_LPS.nii.gz"
dti_bvec_LPS_g_CHECK="${GO_TIMROBERTS}/${subjid_g}/${subjid_g}_DWI_30dir_LPS.bvec"
dti_bval_LPS_g_CHECK="${GO_TIMROBERTS}/${subjid_g}/${subjid_g}_DWI_30dir_LPS.bval"

# 校验三个文件是否同时存在
if [[ -f "$dti_nii_LPS_g_CHECK" && -f "$dti_bvec_LPS_g_CHECK" && -f "$dti_bval_LPS_g_CHECK" ]]; then
    echo "所有DTI文件均存在:$subjid_g"
    printf "Y," >> "$INVENTORY_FILE"
else
    echo "部分DTI文件缺失:$subjid_g"
    printf "N," >> "$INVENTORY_FILE"
fi

关键修正说明

  • 完整逻辑校验:使用[[ ... && ... && ... ]]同时校验三个文件的存在性,确保只有全部存在时才返回"Y"。
  • 变量正确引用:所有文件路径变量均加$引用,且用双引号包裹,避免路径含空格或特殊字符时出现解析错误。
  • 明确输出值:直接在分支中写入"Y"或"N",避免未定义变量导致的异常输出。
  • 文件描述符安全:写入CSV文件时,用双引号包裹$INVENTORY_FILE,防止变量含特殊字符时出错。

内容的提问来源于stack exchange,提问作者florence-y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:31:03