【问题标题】:What does [] do in bash? [duplicate][] 在 bash 中做了什么? [复制]
【发布时间】:2012-08-01 13:30:38
【问题描述】:

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

【问题讨论】:

    标签: bash


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • +1 表示“做你要求的,但不是你想要的”
    • 我不希望我的电脑猜测我想要什么,但仍然坚持按照我说的去做。 :-)
    • @Mithrandir ...但如果它以一种不太可能是您真正想要的方式解释您所说的话,那就是一个问题 - 这就是 test 所做的,而 [[ ]] 不是只是可预测的,但也更有可能是正确的。
    • 一个很好的解释,虽然 ABS 充满了错误(我们一直在帮助那些在#bash 中错误地遵循其建议的人),这可能会导致人们出现 - - 或许可以在mywiki.wooledge.org/BashGuide/TestsAndConditionals 中添加“了解更多信息”链接?
    • @CharlesDuffy 当然你是对的,[[ 更容易使用,但是测试对我来说做得很好(比我承认的要长得多),但是必须使用小心以防止出现意外行为。
    【解决方案2】:

    来自this手册:

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

    [[表达式]]

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

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

    【讨论】:

    • “二进制结果”?也许,但“布尔结果”可能更精确。
    【解决方案3】:

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

    【讨论】:

    • 请注意if [ expression ];if test expression; 是相同的。如果您使用[ 而不是test,则需要右括号作为最后一个参数。此外,test/[ 也是 bash 的内置函数。
    • 这里有什么测试? -z?它有什么作用?
    • @drozzy test -z 确定作为其参数给出的字符串是否为空。
    • @drozzy test -z 测试零长度,实际上是一个空字符串。
    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多