Bash脚本问题:如何将前次循环变量值传递至下一次循环
问题分析与解决办法
你的脚本核心问题在于尝试通过动态变量名(如ID0、ID1)存储作业ID,但实际并未将作业ID赋值给这些变量——你先把var1设为字符串"ID1",紧接着又用qsub的输出覆盖了var1,导致ID1这类变量从未被创建,后续循环中${var}自然无法获取到前一次的作业ID。
另外脚本开头的temp= (40 50)存在语法错误,等号后不能有空格,应改为temp=(40 50)。
修正后的脚本
使用单个变量跟踪前一次作业ID的版本:
temp=(40 50) prev_job_id="" for val in "${temp[@]}"; do dir="${val}-$((val+10))ns" cd "$dir" || continue # 若进入目录失败则跳过当前循环 if [[ -z "$prev_job_id" ]]; then # 第一个作业,无依赖 current_job_id=$(qsub jobsubmission.sh) else # 后续作业,依赖前一次的作业 current_job_id=$(qsub -W depend=afterok:"$prev_job_id" jobsubmission.sh) fi prev_job_id="$current_job_id" # 更新前一次作业ID为当前ID cd .. done
如果需要保留所有作业ID(方便后续查看或处理),可以用数组存储:
temp=(40 50) job_ids=() for val in "${temp[@]}"; do dir="${val}-$((val+10))ns" cd "$dir" || continue if [[ ${#job_ids[@]} -eq 0 ]]; then job_id=$(qsub jobsubmission.sh) else # 取数组最后一个元素作为前一次作业ID(Bash 4.0+支持) job_id=$(qsub -W depend=afterok:"${job_ids[-1]}" jobsubmission.sh) fi job_ids+=("$job_id") # 将当前作业ID加入数组 cd .. done # 可选:打印所有作业ID echo "所有提交的作业ID:${job_ids[*]}"
关键修改点
- 修复了
temp数组的语法错误,移除等号后的空格。 - 放弃复杂的动态变量名方案,改用
prev_job_id变量或job_ids数组直接存储作业ID,避免变量名解析错误。 - 添加
cd "$dir" || continue确保目录切换失败时不会执行后续操作,提升脚本健壮性。 - 简化循环逻辑,直接遍历
temp数组的元素,无需通过索引计算。
内容的提问来源于stack exchange,提问作者subhadip das
相关产品推荐
相关产品推荐

