如何简化命令:四个相同的结构?

如何简化命令:四个相同的结构?
ntpdate 110.75.186.247 >> /var/log/ntpdate.log ||  ntpdate 110.75.186.247 >> /var/log/ntpdate.log || ntpdate 203.123.48.218 >> /var/log/ntpdate.log|| ntpdate 103.16.199.21  >> /var/log/ntpdate.log

我尝试了两种方法,但都没有成功。

ntpdate 110.75.186.247  ||  ntpdate 110.75.186.247  || ntpdate 203.123.48.218 || ntpdate 103.16.199.21  >> /var/log/ntpdate.log
ntpdate 110.75.186.247  ||  ntpdate 110.75.186.247  || ntpdate 203.123.48.218 || ntpdate 103.16.199.21  &&>> /var/log/ntpdate.log

如何简化命令?

答案1

使用一个简单的for构造:

#!/bin/bash
for ip in 110.75.186.247 110.75.186.247 203.123.48.218 103.16.199.21; do
    out="$(ntpdate "$ip" 2>/dev/null)" && echo "$out" >>/var/log/ntpdate.log && break
done

或者将 IP 地址保存在数组中:

#!/bin/bash
ips=( 110.75.186.247 110.75.186.247 203.123.48.218 103.16.199.21 )
for ip in "${ips[@]}"; do
    out="$(ntpdate "$ip" 2>/dev/null)" && echo "$out" >>/var/log/ntpdate.log && break
done

更简单的是,摆脱中间变量(感谢@kos):

#!/bin/bash
ips=( 110.75.186.247 110.75.186.247 203.123.48.218 103.16.199.21 )
for ip in "${ips[@]}"; do
    ntpdate "$ip" 2>/dev/null >>/var/log/ntpdate.log && break
done

答案2

  1. 检查该文件是否.bash_aliases存在于你的主目录中ls -a ~/.bash_aliases (如果不存在,请运行你选择的文本编辑器,在我的情况下是这样的nano ~/.bash_aliases

  2. 在该文件中添加以下行: alias update-time='ntpdate 110.75.186.247 >> /var/log/ntpdate.log || ntpdate 110.75.186.247 >> /var/log/ntpdate.log || ntpdate 203.123.48.218 >> /var/log/ntpdate.log || ntpdate 103.16.199.21 >> /var/log/ntpdate.log'

  3. 保存并退出编辑器

  4. 现在您只需运行命令即可update-time,剩下的就是魔法了:)

答案3

施工问题

ntpdate 192.0.2.1 || ntpdate 203.0.113.2 >> /var/log/ntpdate.log

>>仅适用于最后一个命令。您可以通过在命令周围使用括号来解决这个问题,如下所示:

( ntpdate 192.0.2.1 || ntpdate 203.0.113.2 ) >> /var/log/ntpdate.log

您可能认为ntpdate多次输入是多余的,应该可以消除这种情况。您可以ntpdate使用循环来消除重复。虽然在您的特定情况下,命令非常简单,但使用循环带来的复杂性比它消除的复杂性还要多:

for IP in 192.0.2.1 203.0.113.2
do
    ntpdate "$IP" && break
done >> /var/log/ntpdate.log

或者,也许ntpdate只需调用一次多个服务器地址就可以更好地解决您的原始问题:

ntpdate 192.0.2.1 203.0.113.2 >> /var/log/ntpdate.log

相关内容