此问题已经在这里有了答案:
首先,我很抱歉在编程,编写脚本等方面绝对是菜鸟。我对以前在我的FreeNAS 11.1机器上运行的一些代码有疑问。启动脚本时,我还创建了一个线程。那时我得到了帮助,我的脚本也起作用了。现在,我更新到FreeNAS 11.2并收到了一些消息,我想知道它们为什么出现以及如何解决此问题。
但是首先是背景。我的脚本检查是否有任何客户端在线(通过ping IP地址):
#!/bin/bash
HOST1=10.10.0.100 #Client 1
HOST2=10.10.0.101 #Client 2
HOST3=10.10.0.102 #Client 3
HOST4=10.10.0.103 #Client 4
HOST5=10.10.0.104 #Client 5
_exit () {
case $1 in
1) echo „No Shutdown – At least one PC is online“ ;;
2) echo „No PC is online – Shutdown“ ;; shutdown -p now }
#Check if IPs are online
if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100.0%` -eq 0 ] ; then _exit 1;
#All Clients are offline, shutdown else
_exit 2 fi
脚本本身可以正常工作。如果一个客户端在线,脚本将停止,如果所有客户端都离线,则服务器将关闭。但是当我通过命令行管理程序手动运行它时,会收到以下消息:
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
shutdown_check.sh: -wc not found
[: -eq: unexpected operator
当我在旧服务器(11.1)上运行它时,我没有收到此消息,因此对于我来说很有趣,为什么现在会发生。
上面的代码中有很多单独的,独立的,不相关的错误(使问题“太宽泛”以至于不在站点规则之内;此社区Wiki答案结合了许多已标记重复项的答案)。考虑下面的重写:
#!/bin/bash
hosts=(
10.10.0.100 #Client 1
10.10.0.101 #Client 2
10.10.0.102 #Client 3
10.10.0.103 #Client 4
10.10.0.104 #Client 5
)
for host in "${hosts[@]}"; do
if ping -c 1 -i 1 "$host" >/dev/null; then
echo "No Shutdown - At least one PC ($host) is online"
exit 0
fi
done
echo "No PC is online - Shutdown"
shutdown -p now
那么,特定地原始代码有什么问题?
[ $(...something...) -eq 0 ]
时,只有在test
发出恰好一个字作为输出时,才获得有效的...something...
语句。当您提供grep
无效语法时,它根本不会发出any输出,因此结果为[ -eq 0 ]
。由于[
不在两个单独的参数之间时无法识别-eq
,因此会出现错误。[ "$(...something...)" -eq 0 ]
中所示,则会收到更有用的错误消息(类似于[ "" -eq 0 ]
中给出的错误消息。grep
版本未将-wc
识别为有效的参数组合。grep
的使用本身是不必要的; ping
反映了退出状态的成功或失败,因此可以直接运行if ping ...; then
。