我有一个bash脚本,在其中我定义了以下函数
function start-if-exists()
{
if [ "`docker container ls -a|grep $1`" ]; then
echo "Container $1 exists. Starting $1..."
return `docker start $1`
else
echo "Container $1 doesn't exists."
return ""
fi
}
在终端(zsh
(中直接执行上述功能时,我没有收到任何错误。但是当我使用sh
命令(sh my_script.sh
(执行它时,我会得到以下错误。
my_script.sh:第10行:"如果存在则启动":不是有效的标识符
其中my_script.sh
是文件名。
我的脚本在zsh
中工作,但在sh
中失败,我缺少什么?
/bin/sh
是bash
,但当作为/bin/sh
启动时,它以POSIX模式启动。根据bash
手册页,在POSIX模式下:
- 函数名称必须是有效的shell名称。也就是说,他们可能不会包含字母、数字和下划线以外的字符,以及不能以数字开头。使用无效的声明函数name在非交互式shell中会导致致命的语法错误
关于如何解决此类问题的说明:
- 在终端命令行,我执行了
/bin/sh --version
来查看有关它的信息。它打印了"GNU bash,版本3.2.57(1(-发行版(x86_64-apple-darwin17("> - 然后,我使用命令
man bash
参考了bash
手册页。由于时间很长,您可能更喜欢将副本保存到文件中,然后在首选的文本编辑器中查看。原始man
输出包括过时的下划线和退格。您可以通过执行man bash | col -b > file.txt
来获得没有这些的副本 - 在手册页中,我搜索了"sh"(作为一个完整的单词,而不是对这些字母的原始搜索,因为它们是许多不相关单词的一部分(。这很快揭示了bash在以"sh"开头时表现不同的讨论;它以POSIX模式开始
- 进一步搜索"POSIX"会发现在POSIX模式下有一系列不同的东西