LINUX.ORG.RU

bash скрипт повторяющийся if

 ,


0

1

Всем доброго времени суток, пытаюсь разобраться с написанием скрипта типа:

read confirm
 
if [ $confirm = yes ]
then
	echo Starting operation
elif [ $confirm = no ]
then
	echo Operation is over
else
	echo Unknown statement, try again

fi

Запутался в самом конце, где else, не знаю что бы такого написать, чтоб было лаконично и чтоб связка if повторилась заново, допускаю, что надо вообще подчистую переписать всё, но голова болит, потому прошу подсказку.



Последнее исправление: d_evgenich (всего исправлений: 1)

Ответ на: комментарий от ashot

в общем надо, чтобы если ответ был не yes и не no, связка if повторилась заново, что то мне подсказывает задуматься в сторону while и вообще впихнуть его перед if

d_evgenich
() автор топика
Ответ на: комментарий от init_6

О! Спасибо, сейчас буду пробовать, кажется то что надо!

d_evgenich
() автор топика
Ответ на: комментарий от init_6

case это конечно хорошо, но с выводами я поспешил, заново то проверка не начинается, а очень надо.

d_evgenich
() автор топика
#!/usr/bin/bash

echo Starting operation

while true; do
    read confirm
    if [[ $confirm == yes ]]; then 
        break 
    fi
    echo Unknown statement, try again
done
echo Operation is over
anonymous
()
Ответ на: комментарий от anonymous

Эх хорошо написал. Можно ещё с case ynyesno и к ловеркейсу скастовать переменную или что-то похожее я там делал, как это принято обычно? Просто please say yes or no юзера обычно напрягает.

anonymous
()

goto

между прочим, эталонный случай, где goto читается лучше, чем while

«спроси, и если юзер ответил какую-то фигню, переспрашивай»

vs

«спрашивай юзера до бесконечности, если только он не ответит y или n»

MyTrooName ★★★★★
()
Последнее исправление: MyTrooName (всего исправлений: 3)
Ответ на: комментарий от anonymous

Вай, спасибо огромное, таки решил эту задачу с Вашей помощью, у меня это всё заработало в таком виде:

#!/bin/bash

echo Starting operation

while true; do
    read confirm
    if [ $confirm = yes ]
    then 
        echo Operation is successful
        break
    elif [ $confirm = no ]
    then
        echo Operation is terminated
        break
    fi
    echo Unknown statement, try again
done
echo Operation is over

Если у кого-нибудь есть ещё варианты с тем же case к примеру или goto, рад буду поэксперементировать.

d_evgenich
() автор топика
Ответ на: комментарий от d_evgenich

Сам разобрал вариант с использованием case вот так это выглядит:

#!/bin/bash

echo Starting operation '(yes/no)'

while true; do
	read confirm
	case $confirm in
		yes)
			echo Operation is started
			break
			;;
		no)
			echo Operation is terminated
			break
			;;
	esac
	echo Uknown statement, try again
done
echo Operation was succesfully over
d_evgenich
() автор топика
Ответ на: комментарий от d_evgenich

Во-первых, вам уже намекали, что лучше сделать y|Y|[yY][eE][sS]) .

Во-вторых, чтобы после этого цикла опять не делать разбор, то внутри лучше переприсвоить confirm=y для yes и confirm= для no, тогда можно будет далее проверить confirm только на не пустой.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

ну во-первых Вы с советом вошли уже совсем не вовремя, проблема решена. Во-вторых как раз таки в моём случае совершенно не лучше

сделать y|Y|[yY][eE][sS])

поскольку скрипт который я в конечном итоге написал требует аккуратного использования но это уже не важно.

d_evgenich
() автор топика
Ответ на: комментарий от d_evgenich

проблема решена.

Рекомендации со словами «лучше»  — это не решение, а улучшение решения.

требует аккуратного использования но это уже не важно.

Вот именно, ибо во-вторых было совсем о другом: об использовании полученного.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от d_evgenich

скрипт который я в конечном итоге написал требует аккуратного использования

позвольте поинтересоваться, что именно скрипт делает?

mogwai ★★★★★
()
Последнее исправление: mogwai (всего исправлений: 1)
Ответ на: комментарий от mogwai

скрипт переносит аккаунт с одного сервера на другой и на заключительной стадии интересуется удалить ли его (аккаунт) на сервере источнике или нет, если поспешно тыкнуть y, то можно неслабо пожалеть.

d_evgenich
() автор топика
Ответ на: комментарий от d_evgenich

Думаешь, поспешно на автомате «тыкнуть» yes<Enter> будет сложнее? Особенно, когда привыкнешь, что этот скрипт требует именно «yes»

mogwai ★★★★★
()
Ответ на: комментарий от mogwai

так или иначе эта мера уменьшает вероятность случайности, чтоб не думая набрать yes нужно реально схватить рак мозга

d_evgenich
() автор топика
Ответ на: комментарий от d_evgenich

Ты, похоже, плохо знаешь, как работает человеческий мозг и мышечная память)

Что «yes», что «y» по ошибке вводят не потому, что промахнулись нажать «no»(«n»), а потому что горе погромисты считают, что их «Вы уверены, что хотите сделать это [yes|no)?» — решение задачи, и пихают их куда надо и не надо.

Хочешь защититься от ошибки — проверяй, что аккаунт на новом сервере точно работоспособен, прежде чем удалять на старом.

Хочешь защититься от «переноса» учётки, вместо её «копирования» — добавь ключ, что-то типа --rm-account.

Хочешь двойную проверку — сделай ключ + вопрос [y|N]

vodz тебе всё правильно сказал.

mogwai ★★★★★
()
Ответ на: комментарий от mogwai

вот уж не думал, что сижу на форуме психологов

Ты, похоже, плохо знаешь, как работает человеческий мозг и мышечная память)

В любом случае, тема закрыта, благодарю всех за участие.

d_evgenich
() автор топика
Ответ на: комментарий от d_evgenich

Всё вокруг упирается в первую очередь в психологию, если ты не рептилоид, конечно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.