LINUX.ORG.RU

альтернатива exit 1 для всего скрипта в for

 ,


0

1

Предположим имеется скрипт со следующими строчками:

for i in $LIST ; do
	( cd $i
		if make ; then
			echo $i:	SUCCESS >> $LOGFILE
		else
			echo $i:	FAILURE >> $LOGFILE
		fi
	)
done

Так вот, если после make поставим || exit 1 это просто отправит нас на следующий $i
или же, если в else , то произойдет то же самое;
Еще пробовал LIST=«» в случае ошибки ( || / else ), то же не сработало(

Как сделать, если хоть одна ошибка, то забитое для for перестало выполняться?

★★★★★

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

#!/bin/bash

LOGFILE=output
echo "start">$LOGFILE

for((i=1;i<10;i++)); do
  (
    if [ $i -le 5 ] ; then
      echo $i: SUCCESS >>$LOGFILE
    else
      echo $i:<-->FAILURE >>$LOGFILE
      exit 1
    fi
  )
  if [ $? -eq 1 ]; then break; fi
done

http://www.k-max.name/linux/rabota-interpretatora-bash/ 4.4 При объединении команд в () (круглые скобки), команды группируются и обрабатываются отдельной копией шелла, соответственно со своими переменными и окружением, которое может отличаться от остальных, не включенных в скобки.

anonymous
()
Ответ на: комментарий от akk

С pushd пару раз только что-то пробовал, не знаком в общем(

А если make -C вместо cd?

а толку-то) да и make , я просто в качестве примера написал, там и ls -la может быть

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

насчет скобок-то я знаю, я после них лепить пробовал

if [ $? -eq 1 ]; then break; fi

не помогло

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

не помогло

простите, но почему?

$ ./run.sh
-1---------------------
#!/bin/bash

echo "-1---------------------"
cat run.sh
echo "-2---------------------"
ls -1
echo "-3---------------------"

LOGFILE=output
echo "start">$LOGFILE

for((i=1;i<10;i++)); do
  (
    if [ $i -le 5 ] ; then
      echo $i: SUCCESS >>$LOGFILE
    else
      echo $i: FAILURE >>$LOGFILE
      exit 1
    fi
  )
  if [ $? -eq 1 ]; then break; fi
done

echo "-4---------------------"
cat $LOGFILE
echo "-5---------------------"
-2---------------------
run.sh
-3---------------------
-4---------------------
start
1: SUCCESS
2: SUCCESS
3: SUCCESS
4: SUCCESS
5: SUCCESS
6: FAILURE
-5---------------------

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

Все, спасибо, работает, извиняюсь

exit 1 как раз таки в скобочки не написал в else((

NK ★★★★★
() автор топика
Ответ на: комментарий от NK
$ ./run.sh
-1---------------------
#!/bin/bash

echo "-1---------------------"
cat run.sh
echo "-2---------------------"
ls -1
echo "-3---------------------"

LOGFILE=output
echo "start">$LOGFILE

for((i=1;i<10;i++)); do
  (
    if [ $i -le 5 ] || exit 1 ; then
      echo $i: SUCCESS >>$LOGFILE
    fi
  )
  if [ $? -eq 1 ]; then
    echo $i: FAILURE >>$LOGFILE
    break;
  fi
done

echo "-4---------------------"
cat $LOGFILE
echo "-5---------------------"
-2---------------------
output
run.sh
-3---------------------
-4---------------------
start
1: SUCCESS
2: SUCCESS
3: SUCCESS
4: SUCCESS
5: SUCCESS
6: FAILURE
-5---------------------

а круглые скобки вам точно нужны?

$ 
./run.sh
-1---------------------
#!/bin/bash

echo "-1---------------------"
cat run.sh
echo "-2---------------------"
ls -1
echo "-3---------------------"

LOGFILE=output
echo "start">$LOGFILE

for((i=1;i<10;i++)); do
  if [ $i -le 5 ] ; then
    echo $i: SUCCESS >>$LOGFILE
  else
    echo $i: FAILURE >>$LOGFILE
    break;
  fi
done

echo "-4---------------------"
cat $LOGFILE
echo "-5---------------------"
-2---------------------
output
run.sh
-3---------------------
-4---------------------
start
1: SUCCESS
2: SUCCESS
3: SUCCESS
4: SUCCESS
5: SUCCESS
6: FAILURE
-5---------------------

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

а круглые скобки вам точно нужны?

ну лучше да , что бы cd ../ или «cd -» потом не делать
а хотя, если так посмотреть без разницы

а что этот break чем-то чревато?

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

Если хочешь выходить после команды, не ставь её в условие для if

make && {
    # если ок
    echo $i:	SUCCESS >> $LOGFILE
} || {
    # если фейл
    echo $i:	FAILURE >> $LOGFILE
    exit 1
}
Единственная западня такой формы – ты должен быть уверен, что последняя команда в списке после && отработает без ошибок в любом случае. Для простых echo это вполне допустимо. Дело в том, что результат выполнения списка (в фигурных скобках) это результат последенй выполненной в нём команды.

В принципе, это можно записать и короче

make && echo -e "$i:\tSUCCESS" >> $LOGFILE || {
    echo -e "$i:\tFAILURE" >> $LOGFILE
    exit 1
}
или даже
make && echo -e "$i:\tSUCCESS" >> $LOGFILE || { echo -e "$i:\tFAILURE" >> $LOGFILE; exit 1; }
Если список употребляется в однострочнике, перед закрывающей фигурной скобкой нужна точка с запятой.

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

спасибо, затруднения, как это ни странно, но сколько SlackBuild'ы не писал, это «{»_скобки_«}», ими не пользовался

они как круглые служат?

NK ★★★★★
() автор топика

Ребят , знаете, еще вопрос:

если все что в for выполнилось с успехом, как послать `echo «DONE» >> $LOGFILE`? После done (для for) писал && не то(

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

если все что в for выполнилось с успехом, как послать `echo «DONE» >> $LOGFILE`?

Перед циклом

RESULT="DONE"
внутри «else»
RESULT="something wrong"
после цикла
echo $RESULT >> $LOGFILE

justAmoment ★★★★★
()
Последнее исправление: justAmoment (всего исправлений: 2)

сделать, если хоть одна ошибка, то забитое для for перестало выполняться?

ещё можно

man bash

/trap

/ERR

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

затруднения, как это ни странно, но сколько SlackBuild'ы не писал, это «{»_скобки_«}», ими не пользовался

Не распарсил.

они как круглые служат?

Они служат для объединения команд в списки.

если все что в for выполнилось с успехом, как послать `echo «DONE» >> $LOGFILE`?

Я бы сделал переменную и проверял её.

well_done=t
for …; do
    if …; then
        # OK 
        …;
    else
        # FAIL
        …;
        unset well_done
    fi
done
[ -v well_done ] && echo DONE >> $LOGFILE

Deleted
()
Ответ на: комментарий от justAmoment

Спасибо, вот так сделал:

перед for `RESULT=«DONE»` и в for там где у меня break

	if [ $? -eq 1 ]; then
		RESULT="something wrong"
		break
	fi
ну и после done (for) - `echo $RESULT >> $LOGFILE`

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