12

可能重复:
bash:双括号或单括号、括号、花括号

查看rc.darchlinux中的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 语句中使用,但我在这里看不到。任何帮助深表感谢。谢谢!

4

3 回答 3

11

左括号 ([) 是 test 命令的别名,它执行所有测试并返回 0 表示真或其他值表示假。“if”只对测试命令的返回值作出反应。右括号告诉 test 表达式在哪里结束。双括号 ([[) 是内置的 bash,可以替换外部调用来测试。

于 2012-08-03T13:34:36.777 回答
7

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

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

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

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

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

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

于 2012-08-03T13:37:30.910 回答
0

手册:

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

[[ 表达 ]]

根据条件表达式的评估返回状态 0 或 1。[[' and]]'之间的单词不进行分词和文件名扩展;执行波浪号扩展、参数和变量扩展、算术扩展、命令替换、进程替换和引号删除。

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

于 2012-08-03T13:35:15.467 回答