1. まとめ
ループから変数を印刷したいです。
もしecho $i
ループコマンドの後に入れました。
一生echo $i
ループコマンドの前に以下を入れました。
私はそれを見つけることができませんでした:
- なぜこれが起こるのですか?
- コマンドの前に変数を印刷する方法。
2. スクリプトが実行する作業
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
$ 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
$ 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. 役に立たない
- 頑張るエコの代わりにprintf→私も同じ行動をします。
- 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)"
。