首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Mac OSx终端:函数定义上的“非有效标识符”

Mac OSx终端:函数定义上的“非有效标识符”
EN

Stack Overflow用户
提问于 2018-11-18 19:59:08
回答 1查看 1.6K关注 0票数 2

我有一个bash脚本,在其中我定义了下面的函数,

代码语言:javascript
代码运行次数:0
运行
复制
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中失败

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-18 20:06:21

/bin/shbash,但是当作为/bin/sh启动时,它以POSIX模式启动。根据bash手册页,在POSIX模式下:

  1. 函数名必须是有效的shell ``name。也就是说,它们不可能包含字母、数字和下划线以外的字符,并且不能以数字开头。使用无效名称声明函数会导致非交互式shell中的致命语法错误。

关于如何解决这类问题的说明:

  • 在终端命令行,我执行了/bin/sh --version来查看有关它的信息。它打印了“GNU,版本3.2.57(1)-release (x86_64-apple-darwin17 17)”。
  • 然后,我使用命令bash引用了man bash手册页。因为这很长,所以您可能更喜欢将副本保存到文件中,然后在首选的文本编辑器中查看它。原始的man输出包括过时的下划线和后置空间。您可以通过执行man bash | col -b > file.txt获得一个没有这些内容的副本。
  • 在手册页中,我搜索了“sh”(作为一个完整的单词,而不是对这些字母的原始搜索,因为它们是许多无关单词的一部分)。这很快就揭示了这样的讨论,即bash在作为“sh”启动时的行为有所不同;它以POSIX模式启动。
  • 对“POSIX”的进一步搜索显示了POSIX模式中不同的内容列表。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53364885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档