2015-03-30 1 views
1

Я конвертирую серию сценариев 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 

Кто-нибудь есть какие-либо идеи о том, как получить функцию, чтобы работать, как ожидалось, и получить, если заявления признаются?

Благодаря

+2

Похоже, что пришло время [рефакторинг] (http://en.wikipedia.org/wiki/Code_refactoring) вашего сценария. Выяснение того, как реализовать «goto» на языке, который не включает эту инструкцию, будет генерировать головные боли при управлении кодом в будущем. Лучше переделать вещи, чтобы вам это не нужно. Тем не менее, рассмотрите 'continue' и' break', а также 'trap'. Не так гибки, как «goto» csh, но они могут помочь вам добраться туда, куда вы хотите отправиться. – ghoti

+0

Это должно быть просто обернуть область с gotos как цикл, который содержит 'case $ LABEL'. Уродливо, как ****, но красивее, чем у вас сейчас ... Кстати, вы можете использовать 'exec' вместо' eval'-'exit', я думаю. – hyde

ответ

2

Не пытайтесь воссоздать goto. Вы можете эмулировать операторы потока структурированного управления, такие как if и while с goto, но попытка сделать обратное закончится печалью. Вместо этого выясните, как переписать логику, чтобы она не требовала goto.

if [[ $start == POINT_A ]]; then 
    echo point A stuff 
fi 

echo point B stuff 

if [[ $end == POINT_B ]]; then 
    exit 
fi 

echo point C stuff 

 Смежные вопросы

  • Нет связанных вопросов^_^