1. Resumo
Eu quero imprimir variáveis de loop.
Se eu colocar echo $i
após o comando do loop:
A compilação do Travis CI foi aprovada .
elif coloco echo $i
antes do comando do loop:
não encontro:
- Por que isso está acontecendo,
- como posso imprimir variável antes do comando.
2. O que o script deve fazer
Eu uso HTMLTidy para validar meu HTML .
Eu quero que o HTMLTidy valide todo o HTML na pasta output
e subpastas desta pasta.
Veja simplesmente a configuração do meu projeto.
Script em lote do Windows equivalente em funcionamento:
@echo off
FOR /R %%i IN (*.html) DO echo %%i & tidy -mq %%i
3. Passos para reproduzir
Eu imprimo no console:
cd output && bash ../tidy.sh
../tidy.sh
— caminho para o meu script, veja simplesmente configuration .
4. código de saída 0
Se tidy.sh
:
shopt -s globstar
for i in **/*.html; do
tidy -mq $i
echo $i
done
Compilação do Travis CI aprovada :
$ 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
- Eu tento printf em vez de echo → obtenho o mesmo comportamento.
- Não consigo encontrar resposta para minha pergunta no Google.
O status de saída de um
for
comando composto de loop é o do último comando executado nele¹.Retorna falso (um status de saída diferente de zero) porque
false
foi o último comando executado.echo
retornará verdadeiro, desde que consiga escrever com sucesso o que estamos dizendo.Se você quiser retornar false / failed se algum dos
tidy
comandos falhar, você precisará registrar a falha ou sair na primeira falha:ou:
Esse ainda pode retornar false / failed se falhar
printf
(por exemplo, quando stdout é para um arquivo em um sistema de arquivos que está cheio).Caso queira ignorar algum erro e seu script retornar true / sucesso em qualquer caso, basta adicionar um
true
ouexit 0
no final do seu script.¹ pelo menos para a parte do corpo . Para
for i in $(exit 42); do :; done
, a maioria dos shells retorna 0 (AT&T ksh sendo a exceção). Todos eles retornam 0 parafor i in; do :; done < "$(echo /dev/null; exit 42)"
.