80

我正在尝试bash script在我的 Ubuntu 机器上运行 a ,但它给了我一个错误:

未找到函数

为了测试,我创建了以下脚本,该脚本在我的笔记本电脑上运行良好,但在我的台式机上运行良好。关于为什么的任何想法?如果相关的话,我的笔记本电脑是 Mac。

#!/bin/bash

function sayIt {   
   echo "hello world"
}

sayIt

这会在我的笔记本电脑上返回“hello world”,但在我的桌面上会返回:

run.sh:3:找不到函数你好世界 run.sh:5:语法错误:“}”意外

4

5 回答 5

147

很可能在您的桌面上,您实际上并没有在其下运行,bash而是在dash其他一些不识别function关键字的 POSIX 兼容 shell 下运行。关键字是一个bashism function,一个 bash 扩展。POSIX 语法不使用function并且强制使用括号。

$ more a.sh
#!/bin/sh

function sayIt {   
   echo "hello world"
}

sayIt
$ bash a.sh
hello world
$ dash a.sh
a.sh: 3: function: not found
hello world
a.sh: 5: Syntax error: "}" unexpected

POSIX 语法适用于以下两种情况:

$ more b.sh
#!/bin/sh

sayIt () {   
   echo "hello world"
}

sayIt
$ bash b.sh
hello world
$ dash b.sh
hello world
于 2012-09-18T00:59:44.407 回答
24

我遇到了同样的问题,然后我修改了语法,它对我有用。尽量去掉关键字function,在函数名后括号() 。

#!/bin/bash

sayIt()
{   
   echo "hello world"
}

sayIt
于 2017-10-17T07:08:46.887 回答
7

ls -la /bin/sh

检查它指向 bash 或 dash 的符号链接

于 2019-03-14T18:54:36.423 回答
-1

对我来说,我只是编辑了 bash 配置文件并忘记重新启动我的终端会话。

于 2021-11-14T02:19:41.503 回答
-5

在函数名之后或调用时不需要 () 吗?

function sayIt() { ...
}

sayIt()

? :)

嗯,实际上,在我的 mac 上,它就像你粘贴的那样工作..

dtpwmbp:~ pwadas$ cat aa.sh 
#!/bin/bash

function sayIt() {   
   echo "hello world"
}

sayIt

dtpwmbp:~ pwadas$ ./aa.sh 
hello world
dtpwmbp:~ pwadas$ 

比较 bash 版本,AFAIR 一些旧版本需要“()”。

dtpwmbp:~ pwadas$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
dtpwmbp:~ pwadas$ 

还要比较两个 shell 上的 shopt 选项( man bash )的状态,也许其中一个打开或关闭了一些兼容语法?不带参数的“shopt”命令将列出支持的选项状态。

某些 bash 脚本中使用的“function”关键字是什么?

于 2012-09-18T00:36:21.653 回答