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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:20:59