Как заставить программу меню bash не выходить после выбора одной опции [дублировать]

4
задан David Custer 1 December 2014 в 01:43
поделиться

5 ответов

Поместите его в цикл while. Я также предлагаю вам добавить «сон», чтобы вы не разгоняли процессор своей машины так быстро, как это будет:

while true; do
    ##########################################################################
    ## CHECK TIME
    ##########################################################################
    time=$(date +%k%M)

    if [[ "$time" -ge 1800 ]] && [[ "$time" -le 2200 ]]; then
        echo "Not a good time to transcode video!" && exit 0
    else
        echo "Excellent time to transcode video!" && echo "Lets get started!"
    fi
    ##########################################################################
    ## CHECK TIME
    ##########################################################################
    for i in {1..5}; do
        echo $i
        sleep 1
    done
done
6
ответ дан Ivan X 20 August 2018 в 12:42
поделиться

Вы можете «перезаписать», используя следующую строку:

exec bash "$0" "$@"

Поскольку $0 - это путь к текущему скрипту, эта строка запускает скрипт без создания нового процесса, t нужно беспокоиться о том, что слишком много перезапусков переполняют таблицу процессов на вашем компьютере.

5
ответ дан chepner 20 August 2018 в 12:42
поделиться
  • 1
    Может пройти через "$@", чтобы мы не потеряли аргументы – Charles Duffy 23 October 2017 в 21:44

Это не хорошая практика, но то, что вы просили.

Поместите это в конец вашего скрипта. "$( cd "$( dirname "$0" )" && pwd )/$(basename $0)"

1
ответ дан MeetTitan 20 August 2018 в 12:42
поделиться
  • 1
    ./test.sh: строка 17: /Users/username/Documents./test.sh: нет такого файла или каталога – David Custer 1 December 2014 в 01:33
  • 2
    Хороший улов. Забыл использовать команду basename на $ 0. Должен работать сейчас. – MeetTitan 1 December 2014 в 01:39
  • 3
    Если вы не используете exec, чтобы заменить старый экземпляр новым на месте, тогда вы получаете непрерывную цепочку процессов, когда вы это делаете. И какова добавленная стоимость dirname / basename, а не только exec "$BASH_SOURCE" "$@"? – Charles Duffy 23 October 2017 в 21:43

НЕ ИСПОЛЬЗУЙТЕ WHILE LOOP в начале сценария, так как условие ниже приведет к выходу из сценария и сломает цикл.

echo "Not a good time to transcode video!" && exit 0

Вы можете попробовать захватить выходной сигнал, чтобы при выходе сценария он перезапускает

##########################################################################
## CHECK TIME
############bash##############################################################
trap '<path to script> ' EXIT
time=$(date +%k%M)

if [[ "$time" -ge 1800 ]] && [[ "$time" -le 2200 ]];then
echo "Not a good time to transcode video!" && exit 0
sleep 1;
else
echo "Excellent time to transcode video!" && echo "Lets get started!"
sleep 1;
fi
##########################################################################
## CHECK TIME
##########################################################################
echo 1
echo 2
echo 3
echo 4
echo 5
startover

Примечание. Я добавляю спать 1 секунду, потому что это даст вам время для просмотра сообщения. ловушка выходного сигнала и повторный запуск скрипта действует как цикл while. Я также предполагаю, что эти коды находятся в скрипте.

2
ответ дан repzero 20 August 2018 в 12:42
поделиться
  • 1
    Дэвиду Кастеру: если вы используете цикл while, начинающийся в начале вашего скрипта, ваш скрипт выйдет, если он достигнет условия ниже: echo & quot; Не подходящее время для перекодировки видео! & Quot; & Amp; & Amp; exit 0 ', тем самым вырвавшись из цикла и выходя из скрипта – repzero 1 December 2014 в 01:36
  • 2
    Спасибо за помощь! Я должен был быть более конкретным, это была моя вина. Я обновил вопрос. – David Custer 1 December 2014 в 01:45

Как насчет включения всего скрипта в цикл while? Например,

while :
do
    script
done

Возможно, вы захотите добавить условие для выхода из цикла.

1
ответ дан unxnut 20 August 2018 в 12:42
поделиться