Я конвертирую серию сценариев csh в bash, поскольку они должны работать на двух разных системах. В настоящее время скрипты работают на одной системе, но не на других. Преобразование в bash требуется, чтобы они работали над обоими. Кроме того, для работы сценариев в одной системе требуется определенное кодирование (это не влияет на то, как он работает на другом).Bash - проблема с созданием эквивалента 'goto'
Пока все преобразованные скрипты работают нормально, но теперь у меня есть скрипт, который имеет функцию «goto». Поскольку у bash нет эквивалента 'goto', я пытаюсь найти решение, которое работает.
Сценарий имеет несколько начальных и конечных параметров, которые извлекаются из отдельного файла конфигурации. Затем они позволяют сценарию запускаться и останавливаться в разных точках. Например:
старт: POINT_A/POINT_B
конец: POINT_B/POINT_C
Это означает, что сценарий может начаться в POINT_A или В, но точка А может заканчиваться в точке В или С, или POINT_B может только конец на C. У сценария больше очков, чем это, но это должно объяснить, что должен делать сценарий.
Я нашел функцию, которая, кажется, работает, но имеет в ней «eval», и, по-видимому, это плохой код и не должен использоваться. Он также противоречит некоторым операторам if (т. Е. Кодирование игнорируется и возникает ошибка). Я ищу лучшее решение, чем тот, который я до сих пор:
begin=$1
finish=$2
function jumpto
{
label=$1
cmd=$(sed -n "/$label:/{:a;n;p;ba};" $0 | grep -v ':$')
eval "$cmd"
exit
}
start=${begin:-"start"}
end=${finish:-"end"}
jumpto $start
POINT_A:
echo "start at POINT_A"
# point_a coding here
if [ $end == "POINT_B" ]; then
echo "Done POINT_A commands, finished working before POINT_B"
exit 0
else
jumpto POINT_B
fi
POINT_B:
echo "start at POINT_B"
# point_b coding here
if [ $end == "POINT_C" ]; then
echo "Done POINT_B commands, finished working before POINT_C"
exit 0
else
jumpto POINT_C
fi
POINT_C:
echo "all finished"
Кодирование, что игнорируется то, если заявления, которые происходят в рамках кодирования point_x. Это могут быть:
if [ $var1 == yes ]; then
xxxx
else
:
fi
if [ ! -e $var1 ]; then
xxxx
else
:
fi
Кто-нибудь есть какие-либо идеи о том, как получить функцию, чтобы работать, как ожидалось, и получить, если заявления признаются?
Благодаря
Похоже, что пришло время [рефакторинг] (http://en.wikipedia.org/wiki/Code_refactoring) вашего сценария. Выяснение того, как реализовать «goto» на языке, который не включает эту инструкцию, будет генерировать головные боли при управлении кодом в будущем. Лучше переделать вещи, чтобы вам это не нужно. Тем не менее, рассмотрите 'continue' и' break', а также 'trap'. Не так гибки, как «goto» csh, но они могут помочь вам добраться туда, куда вы хотите отправиться. – ghoti
Это должно быть просто обернуть область с gotos как цикл, который содержит 'case $ LABEL'. Уродливо, как ****, но красивее, чем у вас сейчас ... Кстати, вы можете использовать 'exec' вместо' eval'-'exit', я думаю. – hyde