【问题标题】:`[ "$(...)" = *FAIL* ]` not working in POSIX sh script`[ "$(...)" = *FAIL* ]` 在 POSIX sh 脚本中不起作用
【发布时间】:2021-08-13 23:55:29
【问题描述】:

这是 .sh 脚本的示例:

#!/bin/sh

........

if [ "$(tail -n 1 log_file.txt)" = *"FAIL"* ]; then
  exit 1
else
  # some command here
  exit 0
fi

它必须匹配某个文件的最后一行,模式为“FAIL”,如果匹配结果为真,则返回退出代码 1,否则返回 0。

在这种情况下,脚本总是以退出代码 0 终止,即使对于那些不包含 FAIL 子字符串的字符串也是如此。 请帮我修复 if 语句。

附: shebang 必须是 #!/bin/sh 而不是 #!/bin/bash

【问题讨论】:

  • 我认为 sh 测试不会与 = 进行通配符匹配,只是直接相等。
  • 即使是 bash [ 也没有;它是 [[-only 语法,因此仅在具有 ksh 启发功能的 shell 中可用。

标签: shell if-statement


【解决方案1】:

如果您想在 sh 中进行 fnmatch/glob 样式匹配,请使用 case,而不是 if

case "$(tail -n 1 log_file.txt)" in 
  *"FAIL"*) exit 1;;
  *)        : "some command here"; exit 0;;
esac

【讨论】:

    【解决方案2】:

    您不需要if 语句,因为无论哪种情况您都想立即退出。只需将 check 设置为脚本的最后一个命令即可。

    在这种情况下,脚本的退出状态将是grep 退出状态的否定(如果找到匹配则退出 0,否则退出 1)。

    ! tail -n 1 log_file.txt | grep '.*FAIL.*'
    

    【讨论】:

    • 如果我需要在 else 分支中添加命令?
    • 然后在问题中提及。
    • 但是您可以在if 语句中使用任何命令,而不仅仅是[ ... ]: if tail -n 1 log_file.txt | grep '.*FAIL.*'; then ...; else ...; fi
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2017-07-26
    • 2020-03-28
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多