对于 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
带有可选的elif
orelse
子句。
该命令可以是test
or[
或finger
orgrep
或其他任何东西(甚至是长而复杂的命令管道),每个程序在退出时都会返回一个退出代码。正如 @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 `['.