Bash не работает как обычные языки программирования, когда речь идет о возвращаемых значениях.
Здесь вы путаете вывод из checkFolderExist с статусом возврата из checkFolderExist.
Ваши переменные CHECKINPUT и CHECKOUTPUT будут пустыми, потому что ваша функция ничего не делает echo
и printf
.
Если вы действительно хотите сохранить статус возврата функции для последующего использования, лучше сделать:
checkFolderExist "${INPUT}"
CHECKINPUT=$?
checkFolderExist "${OUTPUT}"
CHECKOUTPUT=$?
Помимо этого, я в любом случае рекомендую вам следовать советам в ответе Кусалананды , которые подскажут вам лучшие методы решения проблемы.
Вы можете просто позволить find
использовать значение, возвращаемое сценарием. например
find. -name "*.sh" -exec '{}' \; -print
выполнит сценарий, а затем -print
напечатает только имена тех сценариев, которые возвращают 0. Вывод будет чередоваться с выводом сценариев, поэтому, возможно, вы просто хотите перенаправить вывод сценария в другое место. С другой стороны, если вы хотите напечатать красивое резюме в конце, возможно, вы ищете что-то вроде:
{ find. -name '*.sh' -exec sh -c 'if "$1" >&3; then
echo success; else echo fail; fi' _ {} \; \
| awk '/success/{s++} /fail/{e++}
END {printf "%d successes out of %d\n", s, s + e}
'; } 3>&1
Ваша переменная commandline
будет содержать вывод команды find
и все ваши сценарии. Ничего больше.
Если вы хотите запустить все .sh
файлы и подсчитать, сколько из них успешно выполнено, будет проще сделать
shopt -s globstar nullglob dotglob
set --./**/*.sh
printf 'Testing %d scripts...\n' "$#"
success=0
for script do
"$script" && success=$(( success + 1 ))
done
printf '%d out of %d finished successfully\n' "$success" "$#"
Параметры оболочки, которые я установил, разрешают **
glob для рекурсивного сопоставления с подкаталогами (globstar
), заставляют не -совпадающие шаблоны исчезать, а не оставаться нераскрытыми (nullglob
), и заставляют шаблоны соответствовать скрытым именам(dotglob
).
Затем код устанавливает позиционные параметры в список путей к файлам с суффиксом имени файла .sh
. Цикл перебирает список и пытается запустить каждый из них. Если запуск выполнен успешно, счетчик увеличивается.
В конце выводится счетчик.
Специальным значением $#
является длина списка позиционных параметров (количество найденных скриптов ).
Обратите внимание, что этот код не заботится о выводе любого из сценариев, а только об их статусе выхода.
С помощью find
вы можете вывести статус выхода для каждого запуска, а затем подсчитать эти:
find. -type f -name '*.sh' -exec sh -c '
for script do
"$script" >/dev/null
printf "%d\n" "$?"
done' sh {} + |
awk '$1 == 0 { success++ }
END { printf("%d out of %d succeeded\n", success, NR) }'
Если у вас меньше 100 скриптов:
find. -name "*.sh" | parallel
echo $? jobs failed
Если у вас более 100 скриптов:
find. -name "*.sh" | parallel --joblog my.log
echo $(cut -f 7 my.log | grep -c '^0$') succeeded