如何循环顺序执行自定义命令?解决rnxEditGde.py路径报错问题
问题解决:循环脚本文件路径错误与命令批量执行修复
问题背景
现有3个变量文件(ionex_list、receiver_ids、data_record)各含9条对应数据,示例如下:
# ionex_list 与 data_record 对应示例 jplg0910.19i.Z ISTA00TUR_R_20190910000_01D_30S_MO.crx.gz jplg0920.19i.Z ISTA00TUR_R_20190920000_01D_30S_MO.crx.gz ... jplg0980.19i.Z ISTA00TUR_R_20190980000_01D_30S_MO.crx.gz jplg0990.19i.Z ISTA00TUR_R_20190990000_01D_30S_MO.crx.gz
编写循环脚本后执行rnxEditGde.py时出现报错:File: "/y2019/d091" does not exist,无法正确定位当前工作目录多级子目录下的.gz文件,导致后续命令无法验证运行状态。原脚本存在路径拼接错误、变量读取逻辑错误、冗余符号干扰等问题。
核心问题分析
- 冗余符号干扰路径解析:脚本中变量前后的
**会被当作路径的一部分,导致文件路径无效 - 行号读取逻辑错误:循环变量
j是日期后缀(091-099),但用sed -n "$j p"读取变量文件时,会尝试读取第91-99行,而变量文件仅9行,导致变量值为空或错误 - 路径拼接错误:使用绝对路径
/y2019/d${j}但实际文件位于当前工作目录的子目录下,未结合当前路径拼接
修复方案与修正脚本
修复步骤
- 移除变量引用时的冗余
**符号 - 修正循环行号逻辑:用循环索引(1-9)读取变量文件的对应行,而非日期后缀值
- 正确拼接文件路径:结合当前工作目录路径,生成有效的相对/绝对路径
- 添加命令执行校验:确保前序命令执行成功后再运行后续命令
修正后的完整脚本
#!/bin/bash set -e # 命令执行失败时立即退出,避免无效循环 dir=$(pwd) # 读取指定行的函数,参数1为行号,参数2为文件名 pl() { sed -n "$1p" "$2" } # 循环索引1-9,对应9条数据 for idx in {1..9}; do # 从变量文件读取对应行的内容 ids=$(pl "$idx" receiver_ids) ionex=$(pl "$idx" ionex_list) dataRecordFile=$(pl "$idx" data_record) # 提取日期后缀(如091、092...),从ionex文件名截取:jplg0910.19i.Z → 091 j=$(echo "$ionex" | cut -c4-6) # 1. 生成树结构文件 gd2e.py -mkTreeS Trees # 2. 替换ionex文件名到配置树 sed -i "s/jplg.*/$ionex/g" "$dir/Trees/ppp_0.tree" # 3. 处理数据记录文件,使用当前目录拼接正确路径 data_file_path="${dir}/y2019/d${j}/${dataRecordFile}" rnxEditGde.py -dataFile "$data_file_path" -o dataRecordFile.Orig.gz # 4. 执行gd2e主命令,确保变量引用无冗余符号 gd2e.py \ -treeSequenceDir Trees \ -drEditedFile "$dataRecordFile" \ -antexFile goa-var/etc/antennaCalsGNSS/igs14_2038.atx \ -GNSS https://sideshow.jpl.nasa.gov/pub/JPL_GNSS_Products/MultiGNSS_Rapid_Test \ -runType PPP \ -recList "$ids" \ -staDb /goa-var/sta_info/sta_db_qlflinn \ >gd2e_"${j}".log 2>gd2e_"${j}".err done
额外优化说明
- 添加
set -e确保命令执行失败时终止循环,避免无效执行 - 日志文件添加日期后缀(
gd2e_091.log),方便区分每次循环的运行日志 - 从
ionex文件名自动提取日期后缀j,避免手动维护循环变量与数据的对应关系,减少出错概率
内容的提问来源于stack exchange,提问作者zeldazonk32
相关产品推荐
相关产品推荐

