루프 내부의 변수 인쇄

루프 내부의 변수 인쇄

1. 요약

루프에서 변수를 인쇄하고 싶습니다.

만약에echo $i루프 명령 뒤에 넣었습니다 .

    Travis CI 빌드 통과.

일생echo $i루프 명령 앞에 다음을 넣었습니다 .

    종료 코드 1이 표시됩니다..

나는 그것을 찾지 못했습니다:

  1. 왜 이런 일이 일어나는가?
  2. 명령 전에 변수를 인쇄하는 방법.

2. 스크립트가 수행해야 하는 작업

나는 사용한다내 HTML 유효성을 검사하기 위한 HTMLTidy.

output나는 HTMLTidy가 이 폴더의 폴더와 하위 폴더에 있는 모든 HTML의 유효성을 검사하기를 원합니다 .

바라보다간단한 구성내 프로젝트.

동등한 Windows 배치 스크립트 작업:

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

3. 재현 단계

콘솔에서 인쇄합니다.

cd output && bash ../tidy.sh
  • ../tidy.sh— 내 스크립트의 경로는 다음을 참조하세요.간단한 구성.

4. 종료 코드 0

만약에 tidy.sh:

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

Travis CI 빌드 통과:

$ 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.종료 코드 1

일생:

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

Travis CI 빌드 실패:

$ 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. 도움이 되지 않음

  1. 나는 노력한다에코 대신 printf→ 저도 같은 행동을 합니다.
  2. Google에서 내 질문에 대한 답변을 찾을 수 없습니다.

답변1

루프 복합 명령의 종료 상태는 for그 안에서 실행된 마지막 명령의 종료 상태입니다.

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

상품을 반품하다잘못된(0이 아닌 종료 상태) false이것이 마지막 명령 실행이었기 때문입니다.

echo우리가 말한 내용을 성공적으로 작성하는 한 이는 true를 반환할 것입니다.

돌아가고 싶다면잘못된/실패하다만약에어느명령이 tidy실패하면 실패를 기록하거나 첫 번째 실패 시 종료해야 합니다.

#! /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"

또는:

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

그 사람은 아직 돌아올 수 있어잘못된/실패하다실패하는 경우 printf(예: stdout이 가득 찬 파일 시스템의 파일을 가리키는 경우)

오류를 무시하고 스크립트가 반환되는 경우진짜/성공어쨌든 true스크립트 끝에 또는 를 추가하면 됩니다.exit 0


적어도부분. 의 경우 for i in $(exit 42); do :; done대부분의 쉘은 0을 반환합니다(AT&T ksh 제외). 그들은 모두 0 을 반환합니다 for i in; do :; done < "$(echo /dev/null; exit 42)".

관련 정보