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
相关产品推荐
相关产品推荐

