如何在for循环中拆分行并用作命令行调用的参数

kai*_*ity 2 bash

我有一个看似非常简单的问题,但我无法提出令人满意的解决方案。我有一个包含 IP 和端口的简单输入文件,例如

10.155.78.0 445
172.17.11.0 3389
Run Code Online (Sandbox Code Playgroud)

现在我想为nc -vvv <ip> <port>for 循环中的每一行执行。

我能想到的就是用 cut 将线分割两次:

for x in $(cat inputfile); do nc -vvv $(echo -n $x | cut -d" " -f1) $(echo -n $x | cut -d" " -f2)
Run Code Online (Sandbox Code Playgroud)

或使用 gawk 并启动一个子 shell

for x in $(cat dingens); do cmd=$(echo $x | gawk -F" " '{ print "nc -vvv -w 2 " $1 " " $2 }'); echo -n $cmd | bash; done
Run Code Online (Sandbox Code Playgroud)

但两种解决方案似乎都非常复杂。没有更好的解决办法吗?

Pau*_*ant 11

while IFS=" " read -r Ip Port Junk <&3; do
    nc -vvv "${Ip}" "${Port}" 3<&-
done 3< inFile
Run Code Online (Sandbox Code Playgroud)

的目的Junk是接收第二个之后的任何字段(例如,评论)。我们inFile在 fd 3 而不是 stdin 上打开,否则nc在该循环中调用也会最终读取inFile

  • 顺便说一句,至少对我来说,基于文件内容运行命令是在 shell 循环中处理文本_不是_一个坏习惯的情况之一。即使它[通常在其他情况下](https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-thinked-bad-practice/169765 #169765)。 (2认同)