Поиск файлов и проверка их успешного выполнения

Bash не работает как обычные языки программирования, когда речь идет о возвращаемых значениях.

Здесь вы путаете вывод из checkFolderExist с статусом возврата из checkFolderExist.

Ваши переменные CHECKINPUT и CHECKOUTPUT будут пустыми, потому что ваша функция ничего не делает echoи printf.

Если вы действительно хотите сохранить статус возврата функции для последующего использования, лучше сделать:

checkFolderExist "${INPUT}"
CHECKINPUT=$?

checkFolderExist "${OUTPUT}"
CHECKOUTPUT=$?

Помимо этого, я в любом случае рекомендую вам следовать советам в ответе Кусалананды , которые подскажут вам лучшие методы решения проблемы.

5
28.03.2020, 00:32
3 ответа

Вы можете просто позволить 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
5
19.03.2021, 02:31

Ваша переменная 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) }'
3
19.03.2021, 02:31

Если у вас меньше 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
4
19.03.2021, 02:31

Теги

Похожие вопросы