FreeBSD 的双方括号

app*_*nic 3 shell freebsd bash

我有这个代码:

[[ "$1" =~ [/\\]$ ]]
Run Code Online (Sandbox Code Playgroud)

在 linux 上它工作得很好,但是当我在 FreeBSD 上测试它时发生了一个错误:./projekt2.sh: [[: not found它......我有任何替代方法可以在两个系统上工作吗?谢谢

BASH 版本:4.3.30(1)-发布

Jde*_*eBP 5

[[是一种bashism。 /bin/sh不保证是 Bourne Again shell。

即使在 Linux 操作系统上,它也可以是 Debian Almquist shell,或 Policy-Compliant Ordinary shell。在 BSD 上,它不是开箱即用的 Bourne Again shell,因为在 BSD 上,Bourne Again shell 是操作系统本身的可选附加组件。它在FreeBSD 端口集合中。(“ports”是在 FreeBSD 上从这些程序的外部维护的源代码库中构建附加程序的便捷方法,而不是 FreeBSD 的一部分。)

/bin/sh在 BSD 上通常是 Bourne 的早期重写之一。在 FreeBSD 上它是 Almquist shell,就像在 Debian Linux 上一样。(在 OpenBSD 上,它是在 POSIX 模式下运行的 Korn shell。)

bashisms 有一个简单的规则:

如果您在脚本中使用 bashisms,请明确设置/bin/bash为脚本解释器。如果改为使用/bin/sh作为脚本解释器,然后坚持到POSIX符合的shell语言孤单

=~也是一种 bashism,而不是该test命令的 POSIX 兼容语法的一部分。但是这里的正则表达式有点矫枉过正,因为您显然真正要做的就是检查最后一个字符。

以下是 Thorsten Glaser 在 2012 年提出的关于做这些事情的建议:

案例 1 美元 
    */|*\\)
        微博;;
    *)
        摇摆不定;;
esac

进一步阅读