Shell **更新.SH文件正确运行时出现的问题

Shell **更新.SH文件正确运行时出现的问题,shell,automation,esxi,Shell,Automation,Esxi,我正在尝试使用此脚本,以便能够基于网络连接关闭我的ESXi服务器。我在vmcommunity上在线找到了这个脚本,似乎没有人和我有相同的问题。当我运行此脚本时,它返回语法错误:意外单词(应为“in”)。然而,在那里有 allInterfaces=$(esxcfg-nics -l | grep vmnic | awk '{print $1}' | awk '$1=$1' OFS=" " RS=) while [ $# -gt 0 ]; do case "$1" in -v) ver

我正在尝试使用此脚本,以便能够基于网络连接关闭我的ESXi服务器。我在vmcommunity上在线找到了这个脚本,似乎没有人和我有相同的问题。当我运行此脚本时,它返回语法错误:意外单词(应为“in”)。然而,在那里有

allInterfaces=$(esxcfg-nics -l | grep vmnic | awk '{print $1}' | awk '$1=$1' OFS=" " RS=)
while [ $# -gt 0 ];
do
   case "$1" in
    -v)  verbose=1;;
    -t)  downCycles=$2; shift;;
    -i)  shift; break;;
    --)  shift; break;;
    -*)  errorLog "wrong parameter:" "$@" ;;
     *)  break;;
     esac
  done 
  shift
任何建议都会非常有用。下面是我尝试使用的完整脚本

#!/bin/bash
verbose=0 
downCycles=3
stateCounter="/tmp/auto-shutdown.counter"

log() {
  logger "auto-shutdown: $1"
  if [ $verbose -gt 0 ]; then
    echo "$1"
  fi
}

errorLog() {
  logger "auto-shutdown error: $1"
  echo -e >&2 "\n$1\n"
  echo -e >&2 "auto-shutdown.sh: shutdown vmware ESXi if network interfaces are down for a number of cycles"
  echo -e >&2 "-------------------------------------------------------------------------------------------------"
  echo -e >&2 "usage: $0 [-v] [-t cycles] [-i vmnic# vmnic# ...]\n"
  echo -e >&2 "       -v: verbose\n"
  echo -e >&2 "   vmnic#: selected vmnic interfaces to monitor"
  echo -e >&2 "           defaults to all available interfaces\n"
  echo -e >&2 "   cycles: the down condition is reached, if all selected vmnic interfaces"
  echo -e >&2 "           have been down for <cycles> consecutive executions of this script\n"
  echo -e >&2 "(c) 2011-10-22 by Ralf Lueders, support@lrconsult.com"
  echo -e >&2 "-------------------------------------------------------------------------------------------------\n"
  exit 1
}


if [ ! -e $stateCounter ]; then
  echo 0 > $stateCounter
  fi


allInterfaces=$(esxcfg-nics -l | grep vmnic | awk '{print $1}' | awk '$1=$1' OFS=" " RS=)
while [ $# -gt 0 ];
do
   case "$1" in
    -v)  verbose=1;;
    -t)  downCycles=$2; shift;;
    -i)  shift; break;;
    --)  shift; break;;
    -*)  errorLog "wrong parameter:" "$@" ;;
     *)  break;;
     esac
  done 
  shift

selectedInterfaces=$*
nosi=0
for interface in $selectedInterfaces; do
  if [ "$(expr "$allInterfaces" : ".*$interface.*")" -eq 0 ]; then
    errorLog "$0 error: interface $interface does not exist"
  fi
  nosi=$( $nosi + 1 )
  done

if [ ${#selectedInterfaces} -eq 0 ]; then
  selectedInterfaces=$allInterfaces
fi

if [ $verbose -gt 0 ]; then
  echo "monitoring interface(s) $selectedInterfaces ..."
fi

downState=1
for interface in $selectedInterfaces; do
  state=$(esxcfg-nics -l | grep "$interface" | awk '{print tolower($4)}')
  if [ "$state" = "up" ]; then
    downState=0
  fi
  done

count=$(cat $stateCounter)


if [ "$count" -eq "$downCycles" ]; then
  log "initiating system shutdown..."
  echo 0 > $stateCounter
  /sbin/shutdown.sh
  /sbin/poweroff
else
  if [ $downState -eq 1 ]; then
    count=$( $count + 1 )
    countDown=$( "$downCycles - $count" )
    log "the interface(s) $selectedInterfaces have now been down for $count cycles, $countDown cycles left before system shutdown."
  else
    count=0
  fi
fi
  echo $count > $stateCounter
#/bin/bash
详细=0
下行周期=3
stateCounter=“/tmp/auto shutdown.counter”
日志(){
记录器“自动关机:$1”
如果[$verbose-gt 0];则
回音“$1”
fi
}
errorLog(){
记录器“自动关闭错误:$1”
echo-e>&2“\n$1\n”
echo-e>&2“auto-shutdown.sh:如果网络接口已关闭多个周期,请关闭vmware ESXi”
echo-e>&2“---------------------------------------------------------------------------------------”
echo-e>&2“用法:$0[-v][t个周期]-[i-vmnic#vmnic#……]\n”
echo-e>&2“-v:详细\n”
echo-e>&2“vmnic#:要监视的选定vmnic接口”
echo-e>&2“默认为所有可用接口\n”
echo-e>&2“循环:如果所有选定的vmnic接口都处于关闭状态”
echo-e>&2“已关闭此脚本的连续执行\n”
回声-e>&2“(c)2011-10-22拉尔夫·卢德斯,support@lrconsult.com"
echo-e>&2“---------------------------------------------------------------------------------------------------------------\n”
出口1
}
如果[!-e$stateCounter];然后
echo 0>$stateCounter
fi
allInterfaces=$(esxcfg NIC-l | grep vmnic | awk'{print$1}'| awk'$1=$1'OFS=”“RS=)
而[$#-gt 0];
做
案件“$1”
-v) 详细=1;;
-t) 下行周期=2美元;移位;;
-i) 转移;打破
--)转移;打破
-*)errorLog“错误参数:$@”;;
*)打破;;
以撒
完成
转移
选择接口=$*
nosi=0
对于$selectedInterface中的接口;做
如果[“$(expr“$allInterfaces”:“*$interface.*””-eq 0];然后
errorLog“$0错误:接口$interface不存在”
fi
nosi=$($nosi+1)
完成
如果[${#selectedInterfaces}-eq 0];然后
selectedInterfaces=$allInterfaces
fi
如果[$verbose-gt 0];然后
echo“监控界面$SelectedInterface…”
fi
下州=1
对于$selectedInterface中的接口;做
状态=$(esxcfg NIC-l | grep“$interface”| awk'{print tolower($4)})
如果[“$state”=“up”];然后
下州=0
fi
完成
计数=$(类别$stateCounter)
如果[“$count”-等式“$downCycles”];然后
日志“启动系统关机…”
echo 0>$stateCounter
/sbin/shutdown.sh
/sbin/断电
其他的
如果[$downState-等式1];然后
计数=$($count+1)
倒计时=$(“$downCycles-$count”)
log“接口$SelectedInterface现在已停止$count cycles,$count cycles,$system shutdown前剩余的倒计时周期。”
其他的
计数=0
fi
fi
echo$count>$stateCounter

我已经使用了查尔斯的建议,在ShellCheck中不再出现错误。然而,我仍然得到了我以前遇到的同样的错误,它说,我错过了一个很明显是在那里。任何人都可以看到其他可以编辑以解决此问题的内容。我真的一点也不熟悉shell脚本,所以任何信息都会有帮助

(1)考虑运行代码并在找到问题之前修复它。(2) 请仅包括定义中给出的证明问题中特定问题所需的最短代码;如果您可以测试短代码段是否能够自己再现问题,那么就不需要更大的代码;如果您不能测试它,那么这个简短的代码片段根本不适合在这里使用。(3) 该特定问题也需要明确指出,以使问题具有可回答性……这里,指出您有一个语法错误:针对您的
案例
有两个独立的
esac
s。(它还提出了许多其他问题;理想情况下,您应该解决所有这些问题)。(在较大的代码中,最后一个
if
也以
done
结束,而不是以
fi
结束;shellcheck也会自动识别这一点,并且能够在解决这两个语法错误后更全面地检查代码的其余部分)…顺便说一句,shellcheck没有发现的一个问题是,由于使用
=
而不是
=
,您的代码与
/bin/sh
的POSIX基线实现不必要地不兼容。只有一个POSIX指定的字符串比较
测试
/
[
接线员,那个接线员是
=
。我已经使用了你的建议,谢谢你,查尔斯。我会看看我能想出什么