FreeBSD 的雙方括號
我有這個程式碼:
[[ "$1" =~ [/\\]$ ]]
在 linux 上它工作得很好,但是當我在 FreeBSD 上測試它時發生了一個錯誤:
./projekt2.sh: [[: not found
而且它.. 我有任何替代方案可以在兩個系統上工作嗎?謝謝BASH 版本:4.3.30(1)-release
語法是 ksh 和 bash的
[[
東西,並不存在於所有 shell 中。您的 FreeBSD 預設 shell 可能是sh
(或 bash 行為類似sh
),而不是 bash。適用於所有 shell 的等效語法是:case $1 in *[/\\] ) echo "Yes";; esac
[[
是一種bashism。/bin/sh
不保證是 Bourne Again shell。即使在 Linux 作業系統上,它也可能是 Debian Almquist shell,或符合策略的普通 shell。在 BSD 上,它不是開箱即用的 Bourne Again shell,因為在 BSD 上,Bourne Again shell 是作業系統本身的可選附加組件。它在FreeBSD ports collection中。(“ports”是在 FreeBSD 上從這些程序的外部維護的源儲存庫建構其他程序的便捷方法,而不是 FreeBSD 的一部分。)
/bin/sh
在 BSD 上通常是早期的 Bourne 重寫之一。在 FreeBSD 上,它是 Almquist shell,就像在 Debian Linux 上一樣。(在 OpenBSD 上,它是在 POSIX 模式下執行的 Korn shell。)bashism 有一個簡單的規則:
如果您在腳本中使用 bashisms,請明確設置
/bin/bash
為腳本解釋器。如果您改為使用腳本解釋器,則僅使用/bin/sh
符合 POSIX 的 shell 語言。
=~
也是一種 bashism,而不是test
命令的 POSIX 兼容語法的一部分。但是這裡的正則表達式是多餘的,因為你顯然真正在做的只是檢查最後一個字元。這是 Thorsten Glaser 從 2012 年開始對做這些事情的建議:
案例 1 美元 */|*\\) 顫抖;; *) 搖晃;; 經社理事會
進一步閱讀
- “實用程序:測試”。 外殼命令語言。單一 UNIX 規範。第 6 期。IEEE 1003.1。2013. 公開組。
- https://superuser.com/a/726762/38062
- https://superuser.com/a/696310/38062
sh
. 2014-01-26。FreeBSD 通用命令手冊。- 破折號為
/bin/sh
。免費維基。- 破折號為
/bin/sh
。Debian 維基。- bashisms。格雷格的維基。
- 外殼命令語言。IEEE 標準 1003.1。問題 7. 開放組。