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

My first Bash script does not look so efficient

这是我的第一个 bash 脚本,使用了我在网上找到的一些资源。我认为有更好的方法可以使用其他形式的条件语句(if then vs control operators)来写这个。

这是一个基本上检查主机是启动还是关闭(检查它是否可 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 <  

谢谢!

你完全可以不用括号:

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

arco444 有正确答案。其他一些注意事项

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