Parar todos os subscritos se o teste falhar

1

Considere a situação:

arquivos de script: main.sh , sub1.sh e sub2.sh .

Em main , chamo sub1 e sub2 . Então, estou executando main para todos os arquivos de uma pasta, usando for :

for file in samples/*.jpg; do bash ./main.sh $file; done

e funciona muito bem.

Mas em sub1 estou computando alguns valores e gostaria de interromper a execução de main para o atual $file se o teste falhar e começar novamente main para o próximo arquivo do loop .

Por exemplo, se a pasta contiver arquivos jpg 01,...,09 e o teste em sub1 falhar no arquivo 04 , pare sub1 para 04 , ignore sub2 para 04 , pare a resto de main para 04 e inicie main para 05 .

O teste é:

if (( $numcc % 3 == 0 ))
then
    ...
else
    ...
fi
    
por Sigur 08.12.2016 / 13:31

1 resposta

2

Três scripts de amostra, main.sh , sub1.sh e sub2.sh são mostrados abaixo. Eles são invocados como mencionado no post, ou seja, for file in samples/*.jpg; do bash ./main.sh $file; done

A idéia básica é que sub1.sh cria um arquivo temporário se o teste falhar; sub2.sh verifica a existência desse arquivo. Finalmente, o arquivo de bloqueio é removido em main.sh toda vez que os outros dois scripts são invocados. Por favor, note que este não é a maneira recomendada para lidar com arquivos temporários, mas apenas para ilustrar o uso.

Para simular o teste, verifiquei se um inteiro aleatório é par ou não. Substitua suas condições reais de teste lá.

O conteúdo de main.sh :

#!/bin/bash

export LOCK_FILE=sub1_failed.txt

echo "$0 $1"

[ -f "$LOCK_FILE" ] && rm "$LOCK_FILE"

bash ./sub1.sh "$1"
bash ./sub2.sh "$1"

O conteúdo de sub1.sh :

#!/bin/bash

echo "$0 $1"

if (( $RANDOM % 2 == 0 ))
then
    # Test failed
    echo "> $0 failed: Creating $LOCK_FILE ..."
    touch "$LOCK_FILE"
else
    # Test successful
    :
fi

O conteúdo de sub2.sh :

#!/bin/bash

echo "$0 $1"

if [ -f "$LOCK_FILE" ]
then
    echo 'Skipping sub2.sh'
    exit 1

else
    echo 'Executing sub2.sh as usual'
fi

echo 'sub2.sh done'
echo ''

A saída de amostra de uma das instâncias de execução é mostrada abaixo. Devido à natureza de $RANDOM , a saída seria diferente toda vez que você executar o código acima.

./main.sh samples/01.jpg
./sub1.sh samples/01.jpg
> ./sub1.sh failed: Creating sub1_failed.txt ...
./sub2.sh samples/01.jpg
Skipping sub2.sh
./main.sh samples/02.jpg
./sub1.sh samples/02.jpg
> ./sub1.sh failed: Creating sub1_failed.txt ...
./sub2.sh samples/02.jpg
Skipping sub2.sh
./main.sh samples/03.jpg
./sub1.sh samples/03.jpg
./sub2.sh samples/03.jpg
Executing sub2.sh as usual
sub2.sh done

./main.sh samples/04.jpg
./sub1.sh samples/04.jpg
> ./sub1.sh failed: Creating sub1_failed.txt ...
./sub2.sh samples/04.jpg
Skipping sub2.sh
./main.sh samples/05.jpg
./sub1.sh samples/05.jpg
./sub2.sh samples/05.jpg
Executing sub2.sh as usual
sub2.sh done
    
por 08.12.2016 / 14:42