ループ内の変数の印刷

ループ内の変数の印刷

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

商品を返す間違った(ゼロ以外の終了状態)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)"

おすすめ記事