我的第一个Bash脚本看起来效率不高

时间:2015-03-26 16:01:37

标签: linux bash scripting automation suse

这是我第一个使用我在网上找到的资源的bash脚本。我认为有一种更好的方法来编写这个可能使用其他形式的条件(如果那么vs控制运算符)。

这是一个基本上检查主机是启动还是关闭的脚本(检查它是否可以ping通)。您将所需的所有IP地址转储到文件中,然后运行调用该文件的脚本。文本文件如下所示:

8.8.8.8                                                                                                             
4.8.8.8                                                                                                             
4.4.4.4                                                                                                             
127.0.0.1

实际脚本如下所示。 2>& 1是否必要,因为它没有。我不得不经常使用括号。

#!/bin/bash                                                                                                         

while read line                                                                                                     
do                                                                                                                  
A=$(ping -c 1 $line)                                                                                                
((echo $A | grep "64 bytes") > /dev/null 2>&1 && (echo "UP - "$line)) || echo "DOWN - "$line                        
done < $1 

谢谢!

2 个答案:

答案 0 :(得分:1)

你可以完全没有括号:

while read -r address; do
  ping -c 1 $address >/dev/null 2>&1 && echo "UP - $address" || echo "DOWN - $address"
done < file

>/dev/null 2>&1将STDOUT和STDERR重定向到/dev/null,这意味着任何ping输出都不会打印到您的终端。

然后,您可以使用&&||运算符在成功的情况下回显消息(ping退出0)或失败(ping退出>0

如果您愿意,可以使用if..then..else:

while read -r address; do
  if ping -c 1 $address > /dev/null 2>&1; then 
    echo "UP - $address"
  else 
    echo "DOWN - $address"
  fi
done < file

答案 1 :(得分:1)

arco444有正确的答案。其他一些笔记

  • 格式为A && B || C,如果A成功,则B执行;如果B失败,C将执行。 if A; then B; else C; fi
  • 不会发生这种情况
  • 正确的缩进非常有助于识别错误(这里没有,但一般情况下)
  • 使用更好的变量名称:$ip$line
  • 更有意义
  • 变量 in 引号
  • 括号引入子壳,这会降低性能。仅在必要时使用