可能重复:
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语句,但我在这里看不到。任何帮助深表感谢。谢谢!
答案 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。