2014-09-09 2 views
1

Я хочу, чтобы мой скрипт заканчивался, если конкретный файл не найден. Поэтому я пишу следующее:команда выхода не работает в bash

[ -f "$DAEMON" ] || (echo "File $DAEMON not found" && exit 0) 

Но он не работает должным образом. Если файл не существует, мой скрипт выводит это сообщение об ошибке и продолжает работать.

Я попытался

[ -f "$DAEMON" ] || { echo "File $DAEMON not found" && exit 0 } 

(как это предлагается здесь exit doesn't work in bash), но я получил ошибку синтаксиса (неожиданный конец файла).

[ -f "$DAEMON" ] || exit 0 хорошо работает, но [ -f "$DAEMON" ] || (exit 0) нет.

Как я могу вывести сообщение об ошибке и остановить выполнение сценария?

ответ

6

Ваша составная команда (конструкция { ... }) требует полуколонии перед закрывающей скобой - она ​​не является обязательной! Так что это сработает:

[ -f "$DAEMON" ] || { echo "File $DAEMON not found" && exit 0; } 
+0

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

3

использовать, если заявление:

if [ ! -f "$DAEMON" ] 
then 
    echo "File $DAEMON not found" 
    exit 0 
fi 
+0

Да, я знаю об утверждении if, но для меня интересно, как это сделать на одной линии. – user2717575

+0

Вашему решению не хватает оператора (!) до -f – user2717575

+0

@ user2717575 Спасибо за исправление, Вы правы – maskacovnik

4

Я думаю, что вы, вероятно, обнаружите, что в someErrorProgram || (exit 0), то exit 0 бежится в подоболочку из-за скобки. . Это означает, что exit выйдет из суб-оболочки, а не оболочку вы думаете, он работает в

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

if [[ ! -f "$DAEMON" ]] ; then 
    echo "File $DAEMON not found" 
    exit 0 
fi 
+0

Более подходящее решение, чем мое: D – maskacovnik

+0

Да, я знаю, если инструкция if, но для меня интересно, как это сделать на одной строке. – user2717575

3

В таких случаях я использую мою errecho функцию, как

errecho() { echo "[email protected]" >&2; return 1; } 

возвращения 1 позволяет мне цепь состояния ошибки, например, как

[[ -f file ]] || errecho "file doesnt exists" || exit 1 

и полезно для более глубоких функций тоже, как

action() { 

    [[ some cond ]] || errecho "errmsg" || return 1 
} 

do_something() { 
    action "$1" "$3" || errecho "action failed with $3" || return 1 
} 

#main 
do_something || errecho "total fail " || exit 1 
0

использовать цикл, и если заявление. С эхом вы можете проверить, до какой точки сценарий пошел. В данном случае скрипт ломается, если он сталкивается с демоном или C, и поэтому только Echos A и B.

for i in A B Daemon C; do 

if 
[ $i == Daemon ] || 
[ $i == C ] 

then 
    break 
fi 

echo "$i" 

done 
1

Вы можете использовать это, если вы хотите, единственное решение строки и она работает

[[ -f "filename" ]] || { echo "file doesnt exists" && exit ;} 

echo "bye" 

I не получил до свидания в консоли, если файл нет.

+0

@ jm666: О да. Моя идея состояла в том, чтобы остановить скрипт, но в любом случае я просто изменил скрипт, чтобы он работал, даже если он нашел файл. Я нашел, что точка с запятой отсутствует и сделала это. – pradipta

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