代码之家  ›  专栏  ›  技术社区  ›  Kannan Ramamoorthy

Mac OSX终端:函数定义上的“不是有效标识符”

  •  0
  • Kannan Ramamoorthy  · 技术社区  · 6 年前

    我有一个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:line 10:`start if exists':不是有效的标识符

    在哪里? my_script.sh 是文件名。

    我的剧本缺少什么 ZSH 但是失败了 ?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Eric Postpischil    6 年前

    /bin/sh bash ,但是,当开始时 /bin/SH ,它以POSIX模式启动。根据 猛击 手册页,在POSIX模式下:

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

    关于如何解决这类问题的注释:

    • 在终端命令行,我执行 /bin/sh --version 查看相关信息。它打印了226; GNU bash,版本3.2.57(1)-发行版(x86_-apple-darwin17)_。
    • 然后我提到 猛击 手册页,使用命令 man bash . 由于这很长,您可能更喜欢将副本保存到文件中,并在首选文本编辑器中查看它。原始的 man 输出包括陈旧的下划线和退格。您可以通过执行 man bash | col -b > file.txt .
    • 在手册页中,我搜索了__sh__(作为一个完整的单词,而不是对那些字母的原始搜索,因为它们是许多不相关单词的一部分)。这很快揭示了bash在以sh开始时的行为不同,它以posix模式开始。
    • 进一步搜索__posix_显示了在posix模式下不同的内容列表。