【发布时间】:2021-05-01 15:01:15
【问题描述】:
我使用 bash 使以下几行工作得很好。
[[ `hostname` =~ -([0-9]+)$ ]] || exit 1
ordinal=${BASH_REMATCH[1]}
很遗憾,我无法访问此容器中的 bash,我正在使用 /bin/sh
第一行报错
[[ `hostname` =~ -([0-9]+)$ ]] || exit 1
ash: syntax error: unexpected "("
我假设第二行即使第一行也行不通:-(
主机名包含以 -n 结尾的名称,其中 n 是数字 0、1、2 等。
即myapp-0 或 myapp-1
我只需要上面创建的序数变量中的数字。
正如我所说,在 bash 中效果很好,但不使用 SH shell。
这里是实际报告的 shell(使用 /bin/sh 因为没有安装 bash)
/ # echo $0
ash
有人帮忙吗?
提前致谢。
【问题讨论】:
-
基本 posix sh 不理解
[[或正则表达式或数组,没有。 -
双方括号
[[ ... ]]是一种bashism,这意味着它们不能保证在符合POSIX 的shell 上工作。如果您需要使用sh,那么您需要创建一个它可以识别的测试表达式。此外,sh也不知道数组是什么。最后一点,在您的错误消息中,您的 shell 实际上是ash- 这些区别很重要,因为每个 shell 实现都有自己的怪癖和警告。见unix.stackexchange.com/a/44916 -
这就像在问“为什么 C 编译器不能运行我的 C++ 代码?” -- 不应该这样。
-
...我编辑了标题来问你真正的问题——不是你为什么在 /bin/sh 中得到错误,而是如何用它来实现你的目标。
-
也就是说,请注意 POSIX 根本不需要设置 HOSTNAME。