@ksvdon

Использование функции внутри функции. Возможно ли в bash?

Сделал функцию для проверки статуса. И отдельно функции для кое-каких проверок по скрипту. Функции использую для того что бы можно было указать (промежуточный) код выхода через return и при этом продолжить скрипт (да и вообще удобно). А функция для проверки статуса как раз смотрит на промежуточный код выхода. И если код не тот, что ожидается - наращивает счетчик ошибки. Было бы здорово делать проверку прямо в функции, а не на выходе что бы какие-то дополнительные строки не испортили мой "заготовленный return". Возможно ли это как-то сделать? Т.к. гляжу, что вставлять функцию в функцию не вариант =( В общем виде это выглядит так:
check=0
function check-exit-stat()
{ if [ $? -ne $1 ]
  then check=`expr $check + 1`
  fi
}

function f1() 
{ k=1
   if [ $k -eq 0 ]
    then
     return 0
    else
     return 1
   fi
#было бы хорошо тут поставить check-exit-stat 0
}
т.к. если сделать так
f1
check-exit-stat 0
exit $check

то возможно какие-то дополнительные записи после "fi" могут изменить статус выходной с того, что я указал при помощи return на любой другой. И это уже не годится. ps тупо делать наращивание счетчика в нужном месте не хотелось бы...
  • Вопрос задан
  • 2687 просмотров
Решения вопроса 1
xotkot
@xotkot
хорошо есть и хорошо весьма
а как же вы хотите выполнять что либо внутри функции после return, ведь return как раз и предназначен для выхода из функции, всё что ниже просто не будет выполнятся.
1) Если же у вас там будет не return а некая команда которая возвращает код возврата($?) то можно просто загнать её в переменную и в конце функции вывести.
#!/usr/bin/bash

check=0

check-exit-stat() {
	if [[ ${1} != ${2} ]]
		then ((check++))
	fi
}

f1() {
	k=1
	if [[ ${k} == "0" ]]
		then ls # return 0
		else blabla # return 127
	fi
N=${?}
check-exit-stat 0 ${N}
return ${N}
}

f1
echo $?
# ...
f1
echo $?
# ...
echo check=$check
exit $check
2) или ещё проще:
#!/usr/bin/bash

check=0

check-exit-stat() {
	if [[ ${1} != ${2} ]]
		then ((check++))
	fi
	return ${check}
}

f1() {
	k=1
	if [[ ${k} == "0" ]]
		then ls # return 0
		else blabla # return 127
	fi
check-exit-stat 0 ${?}
}

f1
echo $?
# ...
f1
echo $?
# ...
echo check=$check
exit $check
3) если же нужно использовать return именно в том месте то можно сделать так :
#!/usr/bin/bash

check=0

check-exit-stat() {
	if [[ ${1} != ${2} ]]
		then ((check++))
	fi
	return ${check}
}

f1() {
	k=1
	if [[ ${k} == "0" ]]
		then check-exit-stat 0 0 # return 0
		else check-exit-stat 0 1 # return 1
	fi
}

f1
echo $?
# ...
f1
echo $?
# ...
echo check=$check
exit $check
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы