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"的错误。
当前代码的问题分析
- 校验逻辑缺失:仅检查了
dti_nii_LPS_g_CHECK文件的存在性,完全忽略了另外两个关键文件(bvec、bval)的校验,导致只要nii文件存在就写入错误值。 - 未定义变量引用:代码中使用了
dti_LPS_g_CHECK变量,但该变量从未定义,会导致写入空字符串或意外内容,而非预期的"Y"。 - 注释中的语法错误:尝试的三文件校验代码
[[[ -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
相关产品推荐
相关产品推荐

