55

是否有if用于 Bash 脚本的所有开关的列表?有时我看到有人在使用它,我想知道他们使用的开关实际上是做什么的。

一个例子就是-z这个。我知道如何使用它,但我不知道它来自哪里。

if [ -z "$BASH_VERSION" ]; then
    echo -e "Error: this script requires the BASH shell!"
    exit 1
fi

任何参考资料、指南、帖子、答案将不胜感激。

4

5 回答 5

46

查看 Bash 手册页 ( man bash)。选项在以下CONDITIONAL EXPRESSIONS部分中指定:

CONDITIONAL EXPRESSIONS
       Conditional expressions are used by the [[  compound  command  and  the
       test  and [ builtin commands to test file attributes and perform string
       and arithmetic comparisons.  Expressions are formed from the  following
       unary  or  binary  primaries.   If any file argument to one of the pri-
       maries is of the form /dev/fd/n, then file descriptor n is checked.  If
       the  file  argument  to  one  of  the  primaries  is one of /dev/stdin,
       /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2,  respectively,
       is checked.

       Unless otherwise specified, primaries that operate on files follow sym-
       bolic links and operate on the target of the link, rather than the link
       itself.

       -a file
              True if file exists.
       ... more options ...

帮助中也有说明:

$ help [
[: [ arg... ]
    This is a synonym for the "test" builtin, but the last
    argument must be a literal `]', to match the opening `['.
于 2013-09-29T17:42:00.813 回答
14

是的。这些被称为条件表达式,它们由[[ 复合命令内置命令使用(只是 的同义词)。test[ [test

阅读Bash 参考手册的第6.4 节 Bash 条件表达式,其中包含所有这些开关及其用法的列表。

于 2013-09-29T04:56:09.010 回答
5

单方括号 ( [ ... ]) 是test命令的同义词。如果您查看test 的手册页,您将看到几乎所有(Bash 可能有一些额外的未在此提及的)各种if 开关,正如您所说的那样。都在一个容易找到的地方。

如果您使用双方括号 ( [[ ... ]]),则您使用的是扩展的 Bash 测试集。这些主要与正则表达式匹配和全局匹配(如果您也有该设置,还有扩展的全局匹配)有关。为此,您必须阅读该 Bash 手册页。

你打电话给他们if switch,但这并不正确。这些是测试if,实际上与命令无关。

if命令仅执行您给它的命令,然后如果该命令返回退出代码0,将运行该语句的if一部分。if否则,它将运行该else部分(如果存在)。

让我们看看这个:

rm foo.test.txt   # Hope this wasn't an important file
if ls foo.test.txt

> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
ls: foo.test.txt: No such file or directory
I can't find it anywhere..

if语句运行该ls foo.test.txt命令并且该ls命令返回一个非零值,因为该文件不存在。这会导致if语句执行else子句。

让我们再试一次...

touch foo.test.txt   # Now this file exists.
if ls foo.test.txt   # Same "if/else" statement as above

> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
foo.test.txt
This file exists

在这里,ls命令返回了0退出状态(因为文件存在并且文件存在并且可以由ls命令声明。

通常,您不应使用该ls命令来测试文件。我只是在这里使用它来显示if语句执行命令,然后根据该命令的退出状态执行iforelse子句。如果你想测试一个文件是否存在,你应该使用test -e命令而不是ls命令:

if test -e foo.test.txt  # The same as above, but using "test" instead of "ls"
then
    echo "This file exists"
else
    echo "I can't find it anywhere..."
fi

如果文件存在,test -e将返回退出状态0。否则,它将返回非零退出状态。

如果你这样做:

ls -i /bin/test /bin/[

10958 /bin/[    10958 /bin/test

10958inode。具有相同inode的文件是同一文件的两个不同名称。因此[testcommand 是软链接的1。这意味着您可以使用[而不是test

if [ -e foo.test.txt ]
then
    echo "This file exists"
else
    echo "I can't find it anywhere.."
fi

是不是很眼熟?


1.在 Bash 中,testand[是内置的,所以当你在 BASH 中运行这些命令时,它没有运行/bin/testor /bin/[。但是,它们仍然相互关联

于 2013-09-30T02:10:25.783 回答
5

它们不是if语句的开关,而是test命令的开关([test内置的同义词)。有关完整列表,请参阅help testBash。

于 2013-09-29T04:54:11.523 回答
3

实际上if,提供这些的并不是它——它的[名称更为人所知的是test. help test应该给你一个它可以采取的所有选项的列表。你也可以看看标准,如果你在乎的话。

于 2013-09-29T04:53:45.800 回答