Bash脚本使用cut命令对变量进行操作,并将结果存储到另一个变量中。

32

我有一个名为config.txt的文件,其中包含像这样的IP地址内容

10.10.10.1:80
10.10.10.13:8080
10.10.10.11:443
10.10.10.12:80

我想要ping文件中的每个ip地址

#!/bin/bash
file=config.txt

for line in `cat $file`
do
  ##this line is not correct, should strip :port and store to ip var
  ip=$line|cut -d\: -f1
  ping $ip
done

我是一名初学者,非常抱歉问这样的问题,但是我自己找不到答案。


for line in cat file 会运行两次...一次是 line=cat,另一次是 line=file。我认为这不是你想要的。 - FatalError
2个回答

61

我会选择awk解决方案,但如果你想理解bash问题,这里是你的脚本的修订版本。

#!/bin/bash -vx

##config file with ip addresses like 10.10.10.1:80
file=config.txt

while read line ; do
  ##this line is not correct, should strip :port and store to ip var
  ip=$( echo "$line" |cut -d\: -f1 )
  ping $ip
done < ${file}

你可以将顶部的代码写成:

for line in $(cat $file) ; do ...

(但不推荐使用)。

你需要使用命令替换 $( ... ) 来获取赋值给 $ip 的值。

通常认为从文件中读取行与模式 while read line ... done < ${file} 更有效率。

希望这可以帮到你。


+1 不仅更安全,而且更高效:for line in $(< file) 将遍历文件中的每个单词,而不是每一行。 - glenn jackman
@yourmother,请注意这里变量周围的引号:保护值中的空格非常重要。 - glenn jackman
2
注意,可以使用ip=${line%%:*}提取IP,而无需调用echo | cut。 - glenn jackman
3
while IFS=: read -r ip _; do 可以被使用。该命令的作用是按照冒号(:)分割每行输入,然后将第一个字段存储在变量ip中,将其余部分存储在下划线变量_中,并在循环内执行特定的操作。 - jordanm
这正是我在寻找的。谢谢!很抱歉我的回答花了这么长时间,但我一直在尝试制作一个好的USB Linux版本。 顺便说一下,我使用的是Universal-USB-Installer ^^ - CodingYourLife

9
您可以通过使用以下方法避免循环和剪切等问题:
awk -F ':' '{system("ping " $1);}' config.txt

然而,如果您发布config.txt的片段,则会更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接