Цикл для проверки УСЛОВИЯ, но запуск КОМАНДЫ только один раз

#bash #shell

#bash #оболочка

Вопрос:

Мне нужно постоянно проверять условие statt до тех пор, пока оно не будет выполнено Yes , если No открыть веб-сайт только один раз и продолжать проверять условие statt , не открывая веб-страницу снова и снова.

каков будет правильный подход?

 statt=$(cat /private/tmp/homee/tat) ##This is a example, in real I am running a command here.

while [[ $statt == "No" ]]
do
    statt=$(cat /private/tmp/homee/tat)
    if [[ $statt == "No" ]]; then
        open https://statckoverflow.com//. ##Only want to open webpage once and wait until condition Yes.
    fi
done

echo "Continue Script....."
 

Ответ №1:

Поскольку ваш while цикл выполняется во время $statt == "No" выполнения, вы можете вызывать open после while цикла, поэтому вы уверены, что $statt != "No" ;

 statt=$(cat /private/tmp/homee/tat)

while [[ $statt == "No" ]]
do
    statt=$(cat /private/tmp/homee/tat)
done

# After while; so $statt is not 'No', call open once
open https://statckoverflow.com//.

echo "Continue Script....."
 

Ответ №2:

Это должно достичь того, чего вы хотели :

 #!/usr/bin/env bash
  
first_time=1
while test "$(</private/tmp/homee/tat)" = no; do
    if  test "$first_time" = 1; then
        open https://statckoverflow.com//. ##Only want to open webpage once and wait until condition Yes.
        first_time=0
    fi
    sleep 1
done

echo "Continue Script....."
 

Или, если вы можете переместить open команду за пределы while цикла, вы можете просто сделать

 #!/usr/bin/env bash
  
open https://statckoverflow.com//. ##Only want to open webpage once and wait until condition Yes.
while test "$(</private/tmp/homee/tat)" = no; do
    sleep 1
done

echo "Continue Script....."
 

Ответ №3:

Нравится это?

 #!/bin/dash
opened='0'
statt="$(command ...)"
while [ "$statt" = 'No' ] ; do
    statt="$(command ...)"
    if [ "$statt" = 'Yes' ]; then
         # do something
    elif [ "$opened" -eq 0 ]; then
         opened='1'
         open 'https://stackoverflow/...'
    fi
    sleep 1
done