Выполнить действие на основе существования каталога

В вашей команде опечатка:

awk -F'#' ' { if(($4+$5)/2 >90) {print $1 "|" $2 "|" $3 "|" $4 "|" $5 "|" ($4+$5)/2 }} input.txt

В конце кода awkпропущена одинарная кавычка. Это должно выглядеть примерно так

awk -F'#' ' { if(($4+$5)/2 >90) {print $1 "|" $2 "|" $3 "|" $4 "|" $5 "|" ($4+$5)/2 }}' input.txt

Кроме того, код awkможно было бы записать как

awk -F '#' -v OFS='|' '($4+$5)/2 > 90 { $(NF+1) = ($4+$5)/2; print }' input.txt

При этом используется OFSдля автоматического разграничения выходных полей с помощью |, а также просто добавляется среднее значение в качестве нового поля в конце текущей записи перед ее выводом. (присвоение $(NF+1)добавляет новый поле; NF— количество полей в текущей записи, а $NF— последнее поле ). Таким образом, нам не нужно упоминать каждое поле, которое мы хотим вывести.

Альтернативное awkрешение:

awk -F '#' -v OFS='|' '($(NF+1) = ($4+$5)/2) > 90' input.txt

Это устанавливает для нового последнего поля среднее значение 4-го и 5-го полей и печатает запись, если это новое поле больше 90. Это позволяет избежать двойного вычисления среднего значения и основывается на том, что printявляется значением по умолчанию для . действие , если подобное условие истинно.

1
03.07.2020, 17:48
1 ответ

2>/dev/nullзначит прятать голову в песок. Он не устраняет опасность, а просто скрывает ее. findпо-прежнему выходит со статусом 1, сигнализируя об ошибке. Сценарии Jenkins shзапускаются с включенным set -e, поэтому это немедленно останавливает сценарий оболочки.

Перед запуском проверьте, существует ли каталог. find.

Во фрагменте ниже я сделал несколько других изменений:

  • Используйте dirДженкинса вместо cd.
  • Исправлено регулярное выражение, переданное в find -regex, для поиска литерала .(, чтобы не совпадать, например.wibble.not-a-zip).
  • Упростите двойное отрицание от ! [ -z "$var" ]до [ -n "$var" ].
dir(WORKSPACE + '/' + BuildLocation) {
    sh '''
        if [ -d Build/ReleaseKit/Installable ]; then
            var=$(find Build/ReleaseKit/Installable/ -regex "$App.*\\.zip" 2>/dev/null)
            echo "$var"
            if [ -n "$var" ]
            then
                echo "App zip found"
                unzip -o Build/ReleaseKit/Installable/App-*.zip
            fi
    '''
}

Поскольку файл, очевидно, должен находиться внутри каталога Installable, а не где-то глубже в подкаталоге (*), вам не нужен find.

dir(WORKSPACE + '/' + BuildLocation) {
    sh '''
        set Build/ReleaseKit/Installable/"$App"*.zip
        if [ -e "$1" ]; then
            echo "App zip found: $1"
            unzip -o "$1"
        fi
    '''
}

Вместо проверки существования файла в sh вы можете сделать это в Groovy с подключаемым модулем шагов утилиты Pipeline .

dir(WORKSPACE + '/' + BuildLocation) {
    def zips = findFiles glob: "Build/ReleaseKit/Installable/${App}*.zip"
    if (findFiles.length > 0) {
        env.app_zip = zips[0]
        sh 'unzip ${app_zip}'
    }
}

(Все фрагменты кода не проверены.)

2
18.03.2021, 23:22

Теги

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