2013-08-20 61 views
3

我最近更新到Ubuntu 13.04和我的shell腳本之一,此爆料:是什麼導致shell腳本中=和==的解釋不同?

#!/bin/sh  
... 
if [ "$SHOW_USAGE" == "true" ]; then 

./install.sh: 248: [: false: unexpected operator 

現在,我明白,我可以通過一個單一的平等取代雙等號(= =)解決這個問題('='),但是在13.04和以前的Ubuntu版本之間,Ubuntu的行爲有什麼不同呢?有沒有辦法恢復以前版本的更靈活的解釋?

+0

取決於你使用的是什麼shell。有些shell現在已經集成了'[''作爲內置命令集成,所以如果你以前的安裝實際上使用'/ usr/bin/test'(它符號鏈接到'''),你會得到不同的行爲。 –

+0

對於嚴格的POSIX合規性,可以使用「=」代替「==」。「從TLDP – user567879

+0

我編輯了問題以表明我正在使用#!/ bin/sh(並且我需要以最大限度保留它兼容性)。 –

回答

3

/bin/sh(不是/bin.sh寫在您的文章中)曾經被鏈接到/bin/bash,但現在鏈接到Ubuntu上的/bin/dash。即使被稱爲sh,bash也容忍一些bashisms。

+0

這看起來像是正確的答案......儘管仔細觀察,我發現'/ bin/sh'已經連接到Ubuntu上的'/ bin/dash',因爲至少10.10。我實際上注意到了CentOS 6.4和Ubuntu之間的行爲變化,並且確實有足夠的CentOS與sh鏈接。 –

1

如果您不介意要求bash運行腳本,則可以使用bash的[[而不是嘗試使用[。有一些不同的行爲,但[[不支持==運營商,而[從來沒有(除可能作爲特定系統上的擴展)。

編輯:由於您使用的是sh,因此==從來沒有正確;你只是因爲系統設置的某些特性而感到幸運。

+0

我剛剛編輯了問題以顯示我正在使用#!/ bin/sh(爲了最大程度的兼容性)。我不能要求bash。 –