2012-03-12 30 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 [[ ... ]] 
...