如何在Shell脚本中从不同路径定义变量并执行?求修正错误脚本
修正后的Shell脚本及问题说明
原脚本的核心问题
- 路径定义错误:
path1/path2不应包含cd命令,只需存储目录路径即可 - 循环语法错误:Shell不支持
for i in ... and v in ...的同时遍历写法,无法直接配对两个目录的文件 - 输出文件名处理错误:直接使用带完整路径的文件名会导致输出目录下生成嵌套路径,不符合需求
- 未处理目标目录:如果目标目录不存在,
cdo命令会执行失败
修正后的脚本
#!/bin/bash # 定义源目录和输出目录的纯路径 path1="/work/bk1088/b382227/pidata/monpctl75" path2="/work/bk1088/b382227/pidata/monpctl25" output_dir="/work/bk1088/b382227/pidata/IQR-75sub25" # 确保输出目录存在,不存在则创建(包含多级目录) mkdir -p "$output_dir" # 将两个目录下的NC文件分别存入数组 files_from_75=("$path1"/*.nc) files_from_25=("$path2"/*.nc) # 按索引遍历数组,配对对应位置的文件 for (( index=0; index<${#files_from_75[@]}; index++ )); do file_75="${files_from_75[index]}" file_25="${files_from_25[index]}" # 跳过不存在的文件(避免其中一个目录文件数量不足时出错) [[ ! -f "$file_75" || ! -f "$file_25" ]] && continue # 提取文件名(去掉路径和后缀),生成输出文件名 base_name=$(basename "$file_75" .nc) output_file="$output_dir/${base_name}_iqr.nc" # 执行CDO减法操作 cdo -a sub "$file_75" "$file_25" "$output_file" done
关键修改说明
- 路径处理:直接存储目录路径,无需包含
cd命令,避免不必要的目录切换 - 文件配对:用数组存储两个目录的文件列表,通过索引实现文件一一配对,确保对应位置的文件执行减法
- 目录检查:
mkdir -p会自动创建不存在的目录,包括多级嵌套目录,避免cdo因目录不存在报错 - 文件名处理:用
basename提取纯文件名,再拼接新后缀,避免输出文件名包含源路径或重复后缀 - 容错处理:增加文件存在检查,当其中一个目录的文件数量少于另一个时,自动跳过不存在的文件对
内容的提问来源于stack exchange,提问作者Hundilida Herijaona
相关产品推荐
相关产品推荐

