何时将测试表达式与 if 语句一起使用?

何时将测试表达式与 if 语句一起使用?

对于 bash 脚本,我对何时将测试表达式与 if 语句一起使用感到困惑。

例如,以下作品。

if finger | grep -q alex

但以下则不然。

if [ finger | grep -q alex ]

但是,我可以执行以下操作。

if [ 3 -gt 5 ]

那么,什么时候使用测试表达式,什么时候不使用呢?另外,有没有办法将测试表达式与上面的命令一起使用?

答案1

我怀疑您困惑的根源在于您不知道test(AKA [)只是另一个返回成功(0)或失败(非零)结果的命令......要么您不完全理解该事实的含义。

if始终运行为:

if command; then
  do something
fi

带有可选的eliforelse子句。

该命令可以是testor[fingerorgrep或其他任何东西(甚至是长而复杂的命令管道),每个程序在退出时都会返回一个退出代码。正如 @Kamil Maciorowski 在评论中所说,唯一重要的if是退出代码,它不关心退出代码来自哪里。

test/[是许多现代 shell(包括 bash)的内置命令,但这并没有真正改变这一点,它只是一种优化,旨在提高非常常用的命令的性能。在它成为内置命令之前,它是-/usr/bin/test事实上/usr/bin/[,这些外部版本的test[至今仍然存在(并且包含在 GNU coreutils 中,尽管它们也是作为 GNU bash 的内置命令提供的)。

$ ls -l /usr/bin/test /usr/bin/[
-rwxr-xr-x 1 root root 68496 Sep 21 01:27 /usr/bin/[
-rwxr-xr-x 1 root root 60304 Sep 21 01:27 /usr/bin/test

$ dlocate /usr/bin/test '/usr/bin/\['
coreutils: /usr/bin/[
coreutils: /usr/bin/test

顺便说一句,来自help [bash:

[: [ arg... ]
    Evaluate conditional expression.
    
    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

相关内容