方括号可执行文件的目的是什么

方括号可执行文件的目的是什么

我看到有一个名为“[”的可执行文件/usr/bin。它的目的是什么?

在此输入图像描述

答案1

在大多数情况下,[是 shell 内置函数,相当于test.但是,与 一样test,它也作为独立的可执行文件存在:这就是/bin/[您所看到的。您可以使用以下命令进行测试type -a [(在 Arch Linux 系统上,运行bash):

$ type -a [
[ is a shell builtin
[ is /bin/[

因此,在我的系统上,我有两个[:我的 shell 的内置文件和/bin.可执行文件记录在man test

TEST(1)                          User Commands                         TEST(1)

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION

DESCRIPTION
       Exit with the status determined by EXPRESSION.

[ ... ]

正如您在上面引用的手册页摘录中看到的,test[是等效的。和/bin/[/bin/test由 POSIX 指定这就是为什么您会找到它们,尽管许多 shell 也将它们作为内置函数提供。它们的存在确保了如下结构:

[ "$var" -gt 10 ]  && echo yes

即使运行它们的 shell 没有[内置函数,它们也会工作。例如,在tcsh

> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ]  && echo yes
yes

答案2

它用于 shell 脚本中的条件测试。该程序的另一个名称是test

if [ 1 -lt 2 ]; then ...

这看起来像 shell 语法,但事实并非如此。通常[是 shell 内置命令,但也可能作为备用命令作为外部命令存在。

请参阅中的“条件表达式”块man bash

答案3

[与 相同的命令test。在某些 *nix 系统上,一个只是到另一个的链接。例如,如果您运行:

strings /usr/bin/test 
strings /usr/bin/[

你会看到相同的输出。

大多数 sh-shells/posix-shells 包含内置命令[test命令。对于 也是如此echo/bin/echo大多数 shell 中都有命令和内置命令。这就是为什么有时您会觉得echo在不同的系统上工作方式不同的原因。

test[仅返回退出代码01。如果测试成功,退出代码为 0。

# you can use [ command but last argument must be ] 
# = inside joke for programmers 
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write 
#    [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2  && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no

您还可以[使用if

if [ -f file.txt ] ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi
# is the same as
if test -f file.txt  ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi

if但您可以与每个命令一起使用,if用于测试退出代码。例如:

cp x y 2>/dev/null && echo cp x y OK ||  echo cp x y not OK

或者,使用if

if cp x y 2>/dev/null ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

test您可以仅使用命令来测试保存到变量的退出代码来获得相同的结果stat

cp x y 2>/dev/null 
stat=$?
if test "$stat" = 0 ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

您还可以使用[[ ]]and进行测试,但它们与and(( ))不同,尽管语法几乎相同:[test

最后,要了解命令是什么,您可以使用:

type -a command

相关内容