【问题标题】:My first Bash script does not look so efficient我的第一个 Bash 脚本看起来效率不高
【发布时间】:2015-05-30 18:08:04
【问题描述】:

这是我使用网上找到的一些资源的第一个 bash 脚本。我认为有一种更好的方法可以使用其他形式的条件(if then 与控制运算符)来编写它。

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

谢谢!

【问题讨论】:

    标签: linux bash scripting automation suse


    【解决方案1】:

    你可以完全不用括号:

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

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

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

    如果您愿意,可以使用 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
    

    【讨论】:

    • 谢谢 :) 我试图给你投票,但我没有足够的声誉或其他东西
    • 不客气。如果您觉得有帮助,请accept the answer
    【解决方案2】:

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

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

    【讨论】:

    • 感谢 Glenn,这对我很有帮助,我现在要进行这些调整。
    • 你的第一点 - 如果 A;then B;else C;fi 那么会发生什么?
    • 如果A成功了,不管B的退出状态如何,C都不会被执行。
    • 当 B 和 C 是像 echo 这样的简单命令时,通常不用担心 A&&B||C:echo 不太可能失败。对于更复杂的事情,这种行为差异是需要牢记的。
    • 非常感谢。您可以在 bash 上推荐我的任何书吗?谢谢.. :D
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多