如何使用for语句解析值列表并传递参数执行iSCSI登录命令?
批量登录iSCSI目标的循环实现方案
你可以通过Shell循环语句,把获取到的每个iSCSI目标名称逐个传入登录命令,这里提供两种实用的方法:
方法一:使用for循环(简单直接)
直接通过命令替换获取目标列表,然后逐个处理:
for target in $(iscsiadm -m discovery -t st -p 192.168.1.11 | awk -F ":" 'NF{print $NF}' | awk 'NR==1{print $1}'); do # 把当前目标名称传入登录命令 iscsiadm -m node -T iqn.2005-10.org.freenas.ctl:"$target" -p 192.168.1.11 -l done
说明:
$(...)会先执行内部的iscsiadm和awk命令,输出你需要的目标列表(vbox、vbox2等)- 循环会依次把每个目标名称赋值给
$target变量,替换到登录命令的对应位置
方法二:使用while循环(更健壮)
如果你的目标名称可能包含特殊字符(比如空格),推荐用while read的方式,逐行读取输出内容:
# 先获取目标列表,再逐行处理 iscsiadm -m discovery -t st -p 192.168.1.11 | awk -F ":" 'NF{print $NF}' | awk 'NR==1{print $1}' | while read -r target; do iscsiadm -m node -T iqn.2005-10.org.freenas.ctl:"$target" -p 192.168.1.11 -l done
说明:
read -r target会安全读取每一行内容并赋值给变量,避免特殊字符导致的解析错误- 这种写法在处理复杂文件名/名称时更可靠
可选优化:简化awk命令
你可以把两个awk命令合并成一个,减少管道操作,提升效率:
# 合并后的目标列表获取命令 iscsiadm -m discovery -t st -p 192.168.1.11 | awk -F ":" 'NF && NR==1 {print $NF}'
把这个替换到上面循环里的对应位置即可。
内容的提问来源于stack exchange,提问作者Tigrillo777
相关产品推荐
相关产品推荐

