單或雙支架和便攜性
關於“if”語句之間的區別,我在這裡找到了一些非常好的答案
[
。對於特定的命名 shell,使用over[[
似乎是一個好主意(而且它也更快)。[[``[
但是,我仍然不清楚可移植性。如果我的目標是為 POSIX 兼容的 shell 編寫腳本,我會以 開頭的腳本,那麼
#!/bin/sh
這種語法的允許程度如何。根據我的閱讀,雙括號不在 POSIX 標準中,但在“現實世界”中,這真的有多大問題?我想我的意思是我想要一個可移植的腳本,但它足以在所有可行的 POSIX shell 上工作,比如 2000-2005。意思是,它不是標準的一部分,真的,但實際上從 2005 年開始的任何 shell 幾乎肯定會接受該語法。
此外,還有一個關於腳本可移植性和 POSIX 的更普遍的問題:其他作者如何處理這個問題?我了解案例和目標受眾決定了大部分決定,但是您是否嘗試盡可能接近 POSIX 以減少整個 Internet 可能存在的不兼容性,或者您是否利用大多數 shell 的所有好東西尚未使其接近 POSIX 標準的支持?
我首先嘗試使我的大部分腳本盡可能符合 Bourne 和 POSIX。不過,隨著時間的推移,通過閱讀更多的 Bash 文件和在網上看到其他人的腳本,我不得不說,利用這些其他功能可以使腳本更易於閱讀,並且在許多情況下更小。
如果我的目標是為 POSIX 兼容的 shell 編寫腳本,我會以 #!/bin/sh 開頭的腳本,那麼這種
[[
語法是多麼允許。一點也不。許多現代的基於 Linux 的系統預設使用
dash
as/bin/sh
,它完全符合 POSIX 標準,不再適用,因此[[
無法正常工作。這包括最近的每個Debian和Ubuntu版本,以及它們的衍生版本,以及許多其他發行版。從歷史上看,這些系統通常在那裡使用 Bash,並故意切換以提高性能。許多其他系統,包括大多數 BSD 和大多數商業 Unices,都不支持
[[
並且永遠不會支持:它們sh
是 POSIX-only,或者它的擴展不包含[[
語法。OpenBSDsh
確實支持 的版本,[[
這與 Bash 的稍有不同;我不知道還有其他人這樣做,儘管它們可能存在。否則,只有將 Bash 用作/bin/sh
(或較少使用zsh
,甚至較少使用其他一些)的系統[[
才能在聲明為sh
腳本的東西中工作。另一方面,大多數係統在實踐中都安裝了 Bash,只要讓你的腳本顯式執行
bash
就足夠了。無論如何, Bash 的sh
-emulation 模式總是被打破。由於您依賴 Bash 功能,因此我看不出有任何理由將其聲明為
sh
腳本:只需說出#!/bin/bash
並完成,[[
盡可能多地使用 - 甚至更好,完全排除的[
。如果您想要最大的可移植性,請使用[
ortest
和 POSIXsh
1,並仔細編寫。1請注意,一些商業 Unices 已經或已經擁有非 POSIX
sh
作為/bin/sh
; 統一處理那些您需要使用系統 POSIX 的完整路徑執行腳本的腳本sh
。