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

Bash脚本按卷名前缀执行SSH仅首个if分支生效问题排查

问题根因
  • 分支结构逻辑错误:使用if...elif互斥分支结构,只要第一个if条件匹配成功,后续elif分支会被直接跳过。当ldap_volList同时包含两类前缀的卷时,因为列表首项是fxn1开头,第一个前缀匹配判断直接成立,执行完fxn1的查询循环就会退出整个分支块,fxn2的逻辑完全没有执行机会。
  • 判断条件逻辑错误:分支判断的匹配对象是整个ldap_volList字符串的开头,和实际需求不符。需求是两类卷的查询逻辑并行执行,只要存在对应前缀的卷就执行对应主机的SSH操作,不是二选一的互斥关系。
修正方案

将互斥的elif结构拆为两个独立判断,判断逻辑改为校验提前筛选好的对应前缀卷列表是否非空,符合并行执行的需求,修正后完整代码如下:

#!/bin/bash
echo "Please enter LDAP Project Name"
read -p "Enter LDAP Project Name:" ldap_proj
ldap_volList=$(grep "$ldap_proj" archive_dashboard/ldap-project-nismap.csv | tr "," "\t"| awk '{print $NF}'| tr -d '"')

array_fxn1=$(echo "$ldap_volList" | grep ^fxn1)    
array_fxn2=$(echo "$ldap_volList" | grep ^fxn2)

if [ ! -z "$ldap_volList" ]; then
   # 存在fxn1前缀卷时执行dbcl101查询
   if [ ! -z "$array_fxn1" ] ; then
     for i in $array_fxn1;do ssh dbcl101 "row 0; vol show $i";done
   fi
   # 存在fxn2前缀卷时执行dbcl201查询,和上一个逻辑互不影响
   if [ ! -z "$array_fxn2" ] ; then
       for i in $array_fxn2;do ssh dbcl201 "row 0; vol show $i";done
   fi
fi

改动说明

  • 移除互斥的elif结构,两个前缀的查询逻辑完全独立,只要对应卷列表有值就会执行,不会出现一类卷查询完跳过另一类的问题
  • 分支判断条件从校验整个卷列表的前缀,改为校验提前筛选出的对应前缀卷列表是否非空,逻辑更准确,不受卷列表内条目的排序影响
  • 修复了原脚本中Plese的拼写错误,移除了多余的cat管道(grep可直接读取文件,无需cat传递内容)

内容的提问来源于stack exchange,提问作者user294110

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:45:31