bash双括号问题

lot*_*ons 24 linux bash shell

我很擅长使用双括号来编写脚本并遇到问题.我似乎无法让他们在Ubuntu Server 11.10中工作.我的脚本位于if_test.sh中.

#!/bin/bash

if [[ "14"=="14" ]]; then 
    echo "FOO"
fi
Run Code Online (Sandbox Code Playgroud)

当我运行这个简单的shell脚本时,我得到的输出是:if_test.sh:5:[[:not found

从终端运行bash --version后,我似乎正在运行GNU bash版本4.2.10.任何帮助将不胜感激.谢谢!

Fré*_*idi 37

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

$ sudo sh if_test.sh
Run Code Online (Sandbox Code Playgroud)

在Ubuntu系统上,/bin/sh 是dash,不是bash,并且dash不支持双括号关键字(或者在发布时没有,我没有仔细检查).您可以通过显式调用bash来解决您的问题:

$ sudo bash if_test.sh
Run Code Online (Sandbox Code Playgroud)

或者,您可以使脚本可执行并依赖shebang行:

$ chmod +x if_test.sh
$ sudo ./if_test.sh
Run Code Online (Sandbox Code Playgroud)

还要注意,在双方括号之间使用时,==是模式匹配运算符,而不是相等运算符.如果要测试相等性,可以使用-eq:

if [[ "14" -eq "14" ]]; then 
    echo "FOO"
fi
Run Code Online (Sandbox Code Playgroud)

或双括号:

if (( 14 == 14 )); then 
    echo "FOO"
fi
Run Code Online (Sandbox Code Playgroud)


Wil*_*ell 6

由于您不[[熟悉脚本,因此您可能不知道这是一种基础.你可能甚至都不知道什么是一种讽刺,但到目前为止给出的两个答案都会引导你走向一个通过促进它们的使用来阻碍脚本未来发展的道路.

要检查变量是否与任何Bourne shell风格的字符串匹配,您可以执行test $V = 14 如果要比较整数,请使用test $V -eq 14.唯一的区别是,如果$ V看起来不像整数,后者会产生错误.引用变量(test "$V" = 14)是有充分理由的,但引号通常是不必要的,我认为是引起共同混淆的根本原因,因为"14"=="14"与"14==14"更明显的是'=='没有被用作运算符的情况相同.

有几点需要注意:使用单个'='而不是'==',因为并非所有shell都识别'==',[命令是相同的,test但需要最终参数]和许多sh编码指南建议使用,test因为它经常使用生成更易理解的代码,[[只能通过有限数量的shell识别(这是您的主要问题,因为您的shell似乎无法识别[[并正在寻找该名称的命令.如果您的shebang确实指定/bin/bash而不是/bin/sh).


Cor*_*ein 5

我的答案并不特别适用于@lots_of_questions的问题,但是如果脚本顶部的说​​明符错误,也可能会遇到此问题:

#!/bin/sh
if [[ ... ]]
...
Run Code Online (Sandbox Code Playgroud)

您应该将其更改为

#!/bin/bash
if [[ ... ]]
...
Run Code Online (Sandbox Code Playgroud)