一、总结
我想从循环中打印变量。
如果我echo $i
在循环命令之后放置:
埃利夫我echo $i
在循环命令之前放置:
我没有找到:
- 为什么会发生这种情况,
- 如何在命令之前打印变量。
2. 脚本应该做什么
我希望 HTMLTidy 验证output
该文件夹的文件夹和子文件夹中的所有 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 代替 echo→ 我也有同样的行为。
- 我在 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
那个人仍然可以回来错误的/失败ifprintf
失败(例如,当 stdout 指向已满的文件系统上的文件时)。
如果您想忽略任何错误并且您的脚本返回真的/成功无论如何,只需在脚本末尾添加一个true
或即可。exit 0
至少对于身体部分。对于for i in $(exit 42); do :; done
,大多数 shell 返回 0(AT&T ksh 除外)。它们都返回 0 for i in; do :; done < "$(echo /dev/null; exit 42)"
。