Bash

FreeBSD 的雙方括號

  • March 29, 2015

我有這個程式碼:

[[ "$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 美元
*/|*\\)
顫抖;;
*)
搖晃;;
經社理事會

進一步閱讀

引用自:https://unix.stackexchange.com/questions/193204