我总是惊讶于文件夹中/bin有一个[程序。
这就是我们在做这样的事情时所说的:if [ something ]?
通过[在 shell 中显式调用程序,它会要求提供相应的],并且当我提供右括号时,无论我在括号之间插入什么,它似乎什么都不做。
毋庸置疑,获得有关程序帮助的通常方法是行不通的,即既不可行man [也不行[ --help。
Sté*_*las 65
该[命令的工作是评估测试表达式。当表达式解析为 true 时返回 0 退出状态(即true),否则返回其他值(即false)。
并不是它什么都不做,只是它的结果要在它的退出状态中找到。在 shell 中,您可以在$?类似 Bourne 的 shell 或$status大多数其他 shell (fish/rc/es/csh/tcsh...) 中找到最后一个命令的退出状态。
$ [ a = a ]
$ echo "$?"
0
$ [ a = b ]
$ echo "$?"
1
Run Code Online (Sandbox Code Playgroud)
在其他语言中,例如perl,退出状态在 的返回值中返回system():
$ perl -le 'print system("[", "a", "=", "a", "]")'
0
Run Code Online (Sandbox Code Playgroud)
请注意,所有现代的类似 Bourne 的 shell(和fish)都有一个内置[命令。/bin通常只有在您使用另一个 shell 或执行类似env [ foo = bar ]或find . -exec [ -f {} ] \; -print或perl上面的命令时才会执行in ...
该[命令也以其test名称而闻名。当被称为 as 时test,它不需要结束]参数。
虽然您的系统可能没有针对 的手册页[,但它可能有针对的手册页test。但同样,请注意,它将记录/bin/[or/bin/test实现。要了解[shell 中的内置函数,您应该阅读 shell 的文档。
有关该实用程序的历史以及与[[...]]ksh 测试表达式的区别的更多信息,您可能想在此处查看其他问答。
jll*_*gre 41
我总是惊讶于文件夹中
/bin有一个[程序。
你感到惊讶是对的。这是罕见的 POSIX 命令之一,带有空实用程序 ( :),它不遵守命令文件允许的字符约定(可移植文件名字符集)。
当我们做这样的事情时被称为:
if [ something ]?
准确地说,但它可以在没有if太的情况下使用。
通过
[在 shell 中显式调用程序,它会要求提供相应的],并且当我提供右括号时,无论我在括号之间插入什么,它似乎什么都不做。
它不做任何可见的事情,但它实际上做的事情与使用 with 时完全相同if,即将退出状态设置为 0 (true) 或任何其他 (false),具体取决于您在括号内放置的内容。它(出于某种原因)与test命令的行为相同;唯一的区别是它寻找结局]。详情请参阅man test。
毋庸置疑,获得有关程序帮助的通常方法是行不通的,即既不可行
man [也不行[ --help。
这取决于您的操作系统。man [在几个主流的 Gnu/Linux 发行版上绝对适用于我,但它不适用于 Solaris。
[ --help可能工作与否取决于实现,因为它无论如何都会破坏语法,缺少结尾]. 此外,对于POSIX标准test/[命令明确排除了所有选项,包括--选项终止这样既[ --help ]和test --help需要返回true,并通过设计沉默。请注意,您放在括号内或之后的内容[和看起来像选项(例如-f file,,-n string等)的内容不是选项而是操作数。
所有现代风格的Bourne外壳口译(如bash,ksh,dash和zsh仅举几例)实现test/[内部实用程序作为内置,所以当你使用它们,正确的手册页指可能是外壳的一个,而不是test一个。
在 Unix System III (1981) 之前,Bourne shell 没有将该test实用程序实现为内置程序,因此只有外部二进制命令实现可用。在[Unix System III 之前没有命令(内部或内置),因此例如在 Unix 版本 7 下,您必须键入:
if test something ; then
…
Run Code Online (Sandbox Code Playgroud)
代替:
if [ something ] ; then
…
Run Code Online (Sandbox Code Playgroud)
Ser*_*nyy 10
[实际上更常称为test命令。此命令的典型用途是简单地评估表达式并返回其条件 - 真或假。它通常用于if-then-else-fi语句中,尽管它可以在语句之外使用,if以通过 shell&&或||运算符有条件地运行其他命令,就像这样。
$ [ -e /etc/passwd ] && echo "File exists"
File exists
$ test -e /etc/passwd && echo "File exists"
File exists
Run Code Online (Sandbox Code Playgroud)
更具体地说,评估通过退出状态传达给其他命令。一些程序可能会选择输出退出状态来表示不同类型的事件 - 程序成功完成、执行期间发生的特定类型错误或语法错误。在test命令的情况下,有0表示真,有1表示假。正如斯蒂芬指出的那样,语法错误会产生2.
它的位置取决于您的系统,它还解释了为什么您在执行man [. 例如,在 FreeBSD 上,它位于/bin. 在 Linux(或在我的特定情况下,Ubuntu 16.04)上,它位于/usr/bin/. 如果您这样做man [或man test在 Linux 系统上,您将看到相同的文档打开。同样重要的是要注意,您的 shell 可能有自己的test.
还应该注意的是,该命令存在一些问题,Korn shell 的实现(通常称为带双方括号的“条件表达式”引用[[ "$USER" = "root" ]])试图解决这些问题。此功能也被其他 shell 使用,例如bash和zsh。