如何在一个循环中定义两个变量而不在bash中重复

如何在一个循环中定义两个变量而不在bash中重复,bash,shell,Bash,Shell,我有一个列表文件,其中包含: 1.1.1.1:50 1.1.1.2:60 1.1.1.3:70 我试图创建两个变量,并执行一个内部应用程序,将第一列与第二列进行散列。我做的是这些循环,但它们给了我9种可能性,我只需要三种: 这是我的剧本 #!/bin/bash for a in $(cat list | cut -d ":" -f 1 ) do for b in $(cat list | cut -d ":" -f 2 ) do echo $a,$b # thi

我有一个
列表
文件,其中包含:

1.1.1.1:50
1.1.1.2:60
1.1.1.3:70
我试图创建两个变量,并执行一个内部应用程序,将第一列与第二列进行散列。我做的是这些循环,但它们给了我9种可能性,我只需要三种:

这是我的剧本

#!/bin/bash
for a in $(cat list | cut -d ":" -f 1 )
do
    for b in $(cat list | cut -d ":" -f 2 )
    do
        echo $a,$b # this is example 
    done
done

唯一需要注意的是,如果在循环中设置其他变量,它们将在子shell中运行,并且不会影响脚本的其余部分。如果需要,有很多方法可以解决这个问题(查找)。

。。。或者干脆
sed-r的/(.*):(.*)/IPv4地址:\1;端口号:\2/“list
@hek2mgl:由于原始文件中的
echo
标记为“这是一个示例”,因此我的答案也是如此。你是对的;如果目标只是将数据回送到标准输出,则不需要循环。目标可能是运行
wget
curl
telnet
或使用IP地址和端口号的东西,在这种情况下,简单的
sed
替换是不够的。端口号并没有真正泄露游戏内容——出于所有实际目的,它们也是假的。(问题是“运行应用程序以散列这两个值”。)很好,echo只是一个示例,您是对的。让我补充一下,我们可以使用
$IFS
而不是
sed
,而IFS=“:”读取ip端口;执行回显“$ip->$port”;完成
是的,您也可以使用IFS。我倾向于使用
sed
或类似的技术,而不是修补IFS。我发现它更健壮,成本可以忽略不计。有些人坚持认为,您应该在shell中完成所有可能在shell中完成的事情(而不是使用shell执行外部命令),以避免开销。这很好——但我经常发现对“效率”的关注被高估了,而对脚本清晰度的降低帮助不大。没关系。我对那件事不是迂腐的。我只是觉得在这种情况下,IFS解决方案是个不错的选择。基本要点是在阅读时使用
,而不是在
上阅读。。在
中,您展示了这一点!
sed 's/:/ /' list |
while read ipv4 port
do
    echo "IPv4 address: $ipv4; Port number: $port"
done