2012-03-12 69 views
20

我对bash脚本非常陌生,在使用双括号时遇到了一个问题。我似乎无法让他们在Ubuntu Server 11.10中工作。我的脚本在if_test.sh中。bash双支架问题

#!/bin/bash 

if [[ "14"=="14" ]]; then 
    echo "FOO" 
fi 

当我运行这个简单的shell脚本输出我得到的是:if_test.sh:5:[[:未找到

看来,我正在运行后GNU bash的版本4.2.10打 - 从终端版本。任何帮助将不胜感激。谢谢!

+0

顺便说一句,没有空格,这不是比较'14'到'14',它检查字符串'14 == 14'是否为空。它会给出与[[“11”==“99”]]完全相同的结果,因为该字符串也不是空的。 – 2018-01-30 23:19:44

回答

35

问题在于你的脚本调用。你发出:

$ sudo sh if_test.sh 

在Ubuntu系统中,/bin/shis dash, not bashdash不支持双支架关键字(或在此张贴的时间都没有,我还没有仔细检查)。您可以通过显式调用bash,而不是解决问题:

$ sudo bash if_test.sh 

或者,您也可以使你的脚本执行,并依靠shebang line

$ chmod +x if_test.sh 
$ sudo ./if_test.sh 

还要注意的是,双方括号之间使用时, ==pattern matching operator,而不是相等运算符。如果你想测试平等,您可以使用-eq

if [[ "14" -eq "14" ]]; then 
    echo "FOO" 
fi 

或者double parentheses

if ((14 == 14)); then 
    echo "FOO" 
fi 
+0

当我尝试[[“14”-eq“14”]]我仍然得到相同的错误。 – 2012-03-12 11:34:13

+0

奇怪的是,自[bash' 2.02版本开始支持[[''关键字)。你如何执行你的脚本?也许你最终使用不同的shell ... – 2012-03-12 11:37:46

+0

我正在执行它:sudo sh if_test.sh – 2012-03-12 11:38:46

6

既然你是新来的脚本,你可能不知道[[是bashism。你甚至可能甚至不知道什么是抨击行为,但是迄今为止所给出的答案正在通过促进它们的使用,使你走向一个发展迟缓的脚本未来的道路。

要检查变量是否与任何Bourne shell的字符串匹配,可以执行test $V = 14如果要比较整数,请使用test $V -eq 14。唯一的区别是如果$ V看起来不像一个整数,那么后者会产生一个错误。有充足的理由引用变量(test "$V" = 14),但引号通常是不必要的,我认为这是造成常见混淆的根本原因,因为"14"=="14""14==14"相同,更明显的是未使用'=='作为运营商。

有几件事情需要注意:使用一个单一的“=”而不是“==”,因为不是所有的炮弹承认“==”,该[命令等同于test,但需要的]和许多SH最终的说法编码指南建议使用test,因为它通常会生成更易于理解的代码,[[只能被有限数量的shell识别(这是您的主要问题,因为您的shell看起来不识别[[并正在查找该名称的命令。是令人惊讶的,如果你的shebang确实指定/bin/bash而不是/bin/sh)。

4

我的回答并不适用于@ lots_of_questions的问题具体,但你也可以运行到这个问题,如果你有错符在脚本的顶部:

#!/bin/sh 
if [[ ... ]] 
... 

你应该改变,要

#!/bin/bash 
if [[ ... ]] 
...