在循环内打印变量

在循环内打印变量

一、总结

我想从循环中打印变量。

如果echo $i在循环命令之后放置:

    Travis CI 构建已通过

埃利夫echo $i在循环命令之前放置:

    我得到退出代码 1

我没有找到:

  1. 为什么会发生这种情况,
  2. 如何在命令之前打印变量。

2. 脚本应该做什么

我用HTMLTidy 用于验证我的 HTML

我希望 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

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 代替 echo→ 我也有同样的行为。
  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

那个人仍然可以回来错误的/失败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)"

相关内容