[]在bash中做什么?

时间:2012-08-03 13:30:34

标签: bash

  

可能重复:
  bash: double or single bracket, parentheses, curly braces

查看archlinux中的rc.d cron脚本:

#!/bin/bash
. /etc/rc.conf
. /etc/rc.d/functions

name=crond
. /etc/conf.d/crond
PID=$(pidof -o %PPID /usr/sbin/crond)

case "$1" in
start)
    stat_busy "Starting $name daemon"
    [[ -z "$PID" ]] && /usr/sbin/crond $CRONDARGS &>/dev/null \
    && { add_daemon $name; stat_done; } \
    || { stat_fail; exit 1; }
    ;;

虽然我可以弄清楚大部分语法,但这有什么用呢:

 [[ -z "$PID" ]]

我看到它也写成:

 [ -z "$PID" ]

在参考文献中,我发现[]用于if语句,但我在这里看不到。任何帮助深表感谢。谢谢!

3 个答案:

答案 0 :(得分:7)

开括号([)是test命令的别名,它执行所有测试并返回0表示true或其他表示false。 “if”仅对测试命令的返回值作出反应。结束括号告诉test表达式结束的位置。双括号([[)是一个内置的bash,可以替换外部调用来测试。

答案 1 :(得分:6)

单个括号模拟/usr/bin/test,一个旧的Unix实用程序。他们做你要求的,但不是你想要的。双括号是改进,是Bash特有的。

http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS

  

存在一个名为[(左括号特殊字符)的专用命令。它是test的同义词,也是出于效率原因的内置函数。此命令将其参数视为比较表达式或文件测试,并返回与比较结果对应的退出状态(0表示true,1表示false)。

     

在版本2.02中,Bash引入了[[...]]扩展测试命令,该命令以对其他语言的程序员更为熟悉的方式执行比较。请注意,[[是关键字,而不是命令。

     

[[和]]之间没有文件名扩展或分词,但有参数扩展和命令替换。

     

使用[[...]]测试构造,而不是[...]可以防止脚本中的许多逻辑错误。例如,&&,||,<和>尽管在[]构造中给出了错误,但是运算符在[[]]测试中工作。

答案 2 :(得分:0)

来自this手册:

  

括号返回表达式的二进制结果:[[]]

     

[[表达]]

     

根据条件表达式的评估,返回0或1的状态。不对[[' and]]'之间的单词执行单词拆分和文件名扩展;代码扩展,参数和变量扩展,算术扩展,命令替换,   执行流程替换和报价删除。

     

&&和||如果expression1的值足以确定整个条件表达式的返回值,则命令不会执行expression2。