** ОБНОВЛЕНИЕ Проблемы с .SH файл работает правильно - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь использовать этот скрипт, чтобы иметь возможность завершить работу моего сервера 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

Я использовал предложения Чарльза и больше не получаю ошибок в ShellCheck. Тем не менее, я все еще получаю ту же ошибку, с которой я сталкивался ранее, когда там говорится, что я пропускаю, что явно там. Любой может увидеть что-нибудь еще, что можно отредактировать, чтобы решить эту проблему. Я действительно не знаком со сценариями оболочки вообще, поэтому любая информация будет полезна.

...