BASH - получение неверного ответа при использовании цикла until или while - PullRequest
0 голосов
/ 28 мая 2020

Мне удалось создать блок кода if-elif-then-else в отдельном скрипте и убедиться, что он работает нормально. Однако, когда я добавил UNTIL или WHILE logi c, я получаю неверный ответ. Я НЕ ожидаю получить этот ответ = «недопустимая операция» , если я вручную создал файл VALIDATE.txt с помощью «продолжить» или "откат" внутри файла. Пожалуйста, проверьте мой код ниже

WHILE SCRIPT

#!/bin/bash
FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
ACTION=`cat /Users/lagot/Documents/BASH-TEST/VALIDATE.txt >>/dev/null 2>&1`
while [ ! -f "$FILE" ]
do
  echo "not exist"
  sleep 60
done

  if [ "${ACTION}" = "proceed" ];
    then
      echo "performing proceed"
      rm -rf $FILE
  elif [ "${ACTION}" = "rollback" ];
    then
      echo "performing rollback"
      rm -rf $FILE
  else
      echo "invalid operation"
      rm -rf $FILE
  fi

UNTIL SCRIPT

#!/bin/bash
FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
ACTION=`cat /Users/lagot/Documents/BASH-TEST/VALIDATE.txt >>/dev/null 2>&1`
until [ -f "$FILE" ]
do
   echo "not exist"
   sleep 60
done
if [ "${ACTION}" = "proceed" ];
  then
    echo "performing proceed"
    rm -rf $FILE
elif [ "${ACTION}" = "rollback" ];
  then
    echo "performing rollback"
    rm -rf $FILE
else
    echo "invalid operation"
    rm -rf $FILE
fi

Я создал VALIDATE. txt в отдельном окне и проверил себя

lagot-pc:BASH-TEST lagot$ echo proceed >> VALIDATE.txt
lagot-pc:BASH-TEST lagot$ pwd
/Users/lagot/Documents/BASH-TEST
lagot-pc:BASH-TEST lagot$ cat /Users/lagot/Documents/BASH-TEST/VALIDATE.txt
proceed

Я получаю неверный ответ «недопустимая операция» вместо «выполнение продолжения» то же самое, если я попробуйте создать VALIDATE.txt и повторить "откат" внутри файла

lagot-pc:BASH-TEST lagot$ ./while-script.sh
not exist
not exist
not exist
not exist
not exist
invalid operation

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Первая часть исходного кода присваивает $ACTION неправильно , и, что еще хуже, она ошибочно пытается присвоить, прежде чем убедиться, что $FILE существует. Поэтому измените эти строки:

FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
ACTION=`cat /Users/lagot/Documents/BASH-TEST/VALIDATE.txt >>/dev/null 2>&1`
until [ -f "$FILE" ]
do
   echo "not exist"
   sleep 60
done

To:

FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
until [ -f "$FILE" ]
do
   echo "not exist"
   sleep 60
done
ACTION=$(<$FILE)

Или (поскольку $(<$FILE) возвращает код ошибки) на одну строку меньше:

FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
until { ACTION=$(<$FILE); } 2> /dev/null
do
   echo "not exist"
   sleep 60
done

После этого остальная часть исходного кода, который проверяет ${ACTION}, должна работать.


Не путайте перенаправление >> (добавить в существующий файл или создать, если файл не существует) с > (перезаписать файл или создать, если файл не существует). Таким образом, такой код echo proceed >> VALIDATE.txt должен быть echo proceed > VALIDATE.txt, иначе, если VALIDATE.txt уже существует и содержит «откат» , результатом будет двухстрочный VALIDATE.txt файл:

rollback
proceed
0 голосов
/ 05 июня 2020

Теперь это исправлено, я также добавил новый формат сценариев UNTIL и WHILE ниже

FIX IN WHILE SCRIPT

#!/bin/bash
FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt

while [ ! -f "$FILE" ]
do
  echo "not exist"
  sleep 60
done

  if [ `cat "$FILE"` = "proceed" ];
    then
      echo "performing proceed"
      rm -rf $FILE
  elif [ `cat "$FILE"` = "rollback" ];
    then
      echo "performing rollback"
      rm -rf $FILE
  else
      echo "invalid operation"
      rm -rf $FILE
  fi

ИСПРАВИТЬ ДО СКРИПТА

#!/bin/bash
FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt

until [ -f "$FILE" ]
do
   echo "not exist"
   sleep 60
done
if [ `cat $FILE` = "proceed" ];
  then
    echo "performing proceed"
    rm -rf $FILE
elif [ `cat $FILE` = "rollback" ];
  then
    echo "performing rollback"
    rm -rf $FILE
else
    echo "invalid operation"
    rm -rf $FILE
fi
...