未找到操作员或出现意外操作符



首先,我想为自己在编程、编写脚本等方面绝对的菜鸟而道歉。我有一个关于我曾经在旧的 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(上运行它时,我没有收到此消息,因此对我来说很有趣,为什么现在会发生。

上面的代码中有很多单独的、独立的、不相关的错误(使问题"过于宽泛"而无法在站点规则范围内;这个社区维基答案结合了许多标记重复项的答案(。考虑以下重写:

#!/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 ]时,只有当...something...只发出一个单词作为输出时,你才会得到一个有效的test语句。当你给出grep无效的语法时,它根本不发出任何输出,所以结果是[ -eq 0 ]。由于[无法识别-eq不在两个单独的参数之间,因此您有错误。
  • 如果您引用正确,如 [ "$(...something...)" -eq 0 ] ,那么您将有一个更有用的错误消息(类似于给[ "" -eq 0 ]的错误消息。
  • 您的 grep 版本无法将-wc识别为有效的参数组合。
  • 使用grep本身是不必要的。 ping反映退出状态的成功或失败,因此可以直接运行if ping ...; then
  • 语法在其他一些方面也被破坏了;运行原始代码 http://shellcheck.net/将显示它们。

最新更新