используя && и || в комбинации не работает - PullRequest
0 голосов
/ 07 июня 2019

У меня есть код, где я хочу установить apt-пакеты из файла и записать результат.

Если это успешно, я хочу напечатать « install: succes», и если это не удастся, мне нужно написать « install: failed» и увеличить переменную с именем fail

IЯ заполнил reqruiment.apt поддельными именами пакетов apt, чтобы он потерпел неудачу.

LOGFILE=log.txt
FAILED=0
for req in $(cat requirements.apt)
    do
        apt install -y "$req" &> aptInstall.log &&
        printf "$req: Succes\n" >> $LOGFILE ||
        (printf "$req: Failed\n" >> $LOGFILE && ((FAILED++)))
    done
        printf "\n\nApt install ran with $FAILED failed packages\n"  >> $LOGFILE
        printf "###############################\n" >> $LOGFILE
        printf "\n\n" >> $LOGFILE

Мой журнал выглядит так:

python-opencv-tre: Failed
build-essential-tre: Failed
python-scipy-tre: Failed


Apt install ran with 0 failed packages
###############################

Я бы ожидал

python-opencv-tre: Failed
build-essential-tre: Failed
python-scipy-tre: Failed


Apt install ran with 3 failed packages
###############################

1 Ответ

4 голосов
/ 07 июня 2019

Проблема в том, что вы увеличиваете количество неудачных запусков в другой оболочке.Когда вы запускаете

(printf "$req: Failed\n" >> $LOGFILE && ((FAILED++)))

, вы запускаете новый процесс;в этом процессе FAILED увеличивается, но не в вашем «главном» процессе.Вы должны удалить эти окружающие скобки.

printf "$req: Failed\n" >> $LOGFILE && ((FAILED++))

ПРИМЕЧАНИЕ : предположим, что вы хотите сгруппировать команды вместе, не вызывая новый процесс;рассмотрите возможность использования фигурных скобок:

{ printf "$req: Failed\n" >> $LOGFILE && ((FAILED++)) ; }

Пример, чтобы показать это вам:

FAILED=0
for i in $(seq 1 3); do
    (echo "FAILED=$FAILED" && ((FAILED++)))
done

дает

FAILED=0
FAILED=0
FAILED=0

Теперь удалите окружающие скобки:

FAILED=0
for i in $(seq 1 3); do
    echo "FAILED=$FAILED" && ((FAILED++))
done

и вы получите

FAILED=0
FAILED=1
FAILED=2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...