Imprimir variável dentro do loop

0

1. Resumo

Eu quero imprimir variáveis do loop.

Se eu coloco echo $i após o comando do loop:

Travis CI build passado .

elif coloco echo $i antes do comando do loop:

recebo o código de saída 1 .

Eu não acho:

  1. por que isso está acontecendo,
  2. como eu posso imprimir variável antes do comando.

2. O que o script deve fazer

Eu uso o HTMLTidy para validar meu HTML .

Eu quero que HTMLTidy valide todo o HTML na pasta output e subpastas desta pasta.

Veja simplesmente configuração do meu projeto.

Trabalhando script de lote do Windows equivalente:

@echo off
FOR /R %%i IN (*.html) DO echo %%i & tidy -mq %%i

3. Etapas para reproduzir

Eu imprimo no console:

cd output && bash ../tidy.sh

4. código de saída 0

Se tidy.sh :

shopt -s globstar
for i in **/*.html; do
    tidy -mq $i
    echo $i
done

Travis CI build passado :

$ cd output && bash ../tidy.sh
line 8 column 9 - Warning: trimming empty <span>
SashaInFolder.html
line 8 column 9 - Warning: trimming empty <div>
subfolder/SashaInSubFolder.html
The command "cd output && bash ../tidy.sh" exited with 0.
Done. Your build exited with 0.

5. código de saída 1

Elif :

shopt -s globstar
for i in **/*.html; do
    echo $i
    tidy -mq $i
done

A compilação do Travis CI falhou :

$ cd output && bash ../tidy.sh
SashaInFolder.html
line 8 column 9 - Warning: trimming empty <span>
subfolder/SashaInSubFolder.html
line 8 column 9 - Warning: trimming empty <div>
The command "cd output && bash ../tidy.sh" exited with 1.
Done. Your build exited with 1.

6. Não ajudou

  1. Eu tento printf em vez de echo → tenho o mesmo comportamento.
  2. Não consigo encontrar resposta para minha pergunta no Google.
por Саша Черных 04.03.2018 / 08:52

1 resposta

2

O status de saída do comando for loop composto é o do último comando executado nele.

for cmd in true false; do
  "$cmd"
done

Retorna falso (um status de saída diferente de zero) porque false foi o último comando executado.

echo retornará verdadeiro, contanto que consiga escrever com sucesso o que estamos dizendo.

Se você quiser retornar falso / falha se qualquer do comando tidy falhar, você precisará registrar o falha, ou sair após a primeira falha:

#! /bin/bash -
shopt -s globstar
ok=true
for i in ./**/*.html; do
  if tidy -mq "$i"; then
    printf '%s\n' "$i"
  else
    ok=false
  fi
done
"$ok"

ou:

#! /bin/bash -
shopt -s globstar
for i in ./**/*.html; do
  tidy -mq "$i" || exit # if tidy fails
  printf '%s\n' "$i"
done

Esse ainda pode retornar falso / falha se printf falhar (por exemplo, quando stdout for para um arquivo em um sistema de arquivos que esteja cheio).

Se você quiser ignorar qualquer erro e seu script retornar verdadeiro / sucesso em qualquer caso, basta adicionar um true ou exit 0 no final de seu roteiro.

¹ pelo menos para a parte body . Para for i in $(exit 42); do :; done , a maioria dos shells retorna 0 (AT & T ksh sendo a exceção). Todos retornam 0 para for i in; do :; done < "$(echo /dev/null; exit 42)" .

    
por 04.03.2018 / 10:13