выход в одну строку - PullRequest
       11

выход в одну строку

0 голосов
/ 26 октября 2011
#!/bin/bash
grep -q 'string1' abc.txt && sed -i~ "s/string1/string2/g" abc.txt || echo "ERROR1! Exiting..."; exit
grep -q 'string2' pqr.txt && sed -i~ "s/string2/string3/g" pqr.txt || echo "ERROR2! Exiting..."; exit

#...Several similar above commands here...

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

Как я могу сделать это здесь?Я не хочу использовать, если условия ...

Спасибо!

Ответы [ 5 ]

3 голосов
/ 26 октября 2011

Вы можете запустить несколько команд, используя {}:

cmd1 || { echo "ERROR" ; exit 1 ; }

, но я предпочитаю оборачивать обработку ошибок в функцию:

error() { # msg 
    echo "$@" 1>&2
    exit 1
}

, что делает ее намного более читабельной:

cmd1 || error "ERROR"

или как это сделать:

try() { # cmd args...
    local msg="ERROR: command failed: $@"
    "$@" || { echo "$msg" 2>&1 ; exit 1 }
}

try cmd1 arg1 arg2...

, который также дает вам приятное сообщение об ошибке.

Если вам нужно объяснение, это тоже просто:

try2() { # msg cmd args...
    local msg="ERROR: $@"
    shift # Swallow first argument
    "$@" || { echo "$msg" 2>&1 ; exit 1 }
}

try2 "Explain what the command is supposed to do" \
    cmd1 arg1 arg2...
3 голосов
/ 26 октября 2011

Что это за увлечение, которое вы, похоже, испытываете (основываясь на этом вопросе и last ), выполняя все в одной строке.У вас есть терминальное устройство с вертикальными вызовами?Взимается ли с вашего департамента плата за строку кода, которую они хранят в репозитории исходного кода?

Фраза «Я не хочу использовать, если условия» не имеет места из уст разумного существа, иэто одно из самых странных искусственных ограничений, о которых я когда-либо слышал.Серьезно, код для читабельности!

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

Тот факт, что вы должны спросить , как это сделать, является признаком того, что это плохая идея.Могу поспорить, что вам не придется спрашивать, как сделать это в виде многострочного, удобочитаемого, понятного оператора if.

Не стесняйтесь опускать меня - это не так, как если бы у меня не хватало репутации:-) Я воспользуюсь этим шансом, так как на SO есть много прецедентов для предоставления ответов, утверждающих, что предпосылка вопроса не является хорошей.Я также поставил бы под сомнение здравомыслие тех, кто хочет кодировать операционные системы в COBOL или учетные приложения в машинном коде 8051.


(a) Без обид, хотя я подозреваюВы не будете принимать этот ответ: -)

2 голосов
/ 26 октября 2011

Вы можете также подключить последний exit к &&.Когда вы используете ;, он будет выполнять все команды в последовательном порядке.Команды после && будут выполняться только в случае успешного выполнения предыдущей команды, команды после || будут выполняться только в случае успешного выполнения предыдущей команды , а не .

grep  && sed || echo "ERROR1! Exiting..." && exit
grep  && sed || echo "ERROR1! Exiting..." && exit
0 голосов
/ 26 октября 2011

Как насчет:

sed -i~ "s/string1/string2/g" abc.txt || exit 1
sed -i~ "s/string2/string3/g" pqr.txt

Или, если вы хотите что-то более подробное:

function doexit
{
    echo "error " $1
    exit $1
}

sed -i~ "s/string1/string2/g" abc.txt || doexit 1
sed -i~ "s/string2/string3/g" pqr.txt
0 голосов
/ 26 октября 2011

Вам необходимо использовать && вместо ;, так как ; означает, что следующая команда будет выполнена независимо от того, сработала первая или не сработала.

...