我正在尝试在我的Ubuntu计算机上运行bash script
并且它给了我一个错误:
找不到功能
为了测试,我创建了以下脚本,它可以在我的笔记本电脑上正常工作,但不能在我的桌面上工作。任何想法为什么?如果相关,我的笔记本电脑就是Mac。
#!/bin/bash
function sayIt {
echo "hello world"
}
sayIt
这会在我的笔记本电脑上返回“hello world”,但在我的桌面上会返回:
run.sh:3:找不到函数hello world run.sh:5:语法错误: “}”意外
答案 0 :(得分:111)
有可能在您的桌面上,您实际上并未在bash
下运行,而是dash
或其他一些无法识别function
关键字的POSIX兼容shell。 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
答案 1 :(得分:10)
我遇到了同样的问题,然后我修改了语法,它对我有用。尝试在功能名称后删除关键字 功能 和添加方括号()
#!/bin/bash
sayIt()
{
echo "hello world"
}
sayIt
答案 2 :(得分:0)
ls -la / bin / sh
检查符号链接,它指向bash或破折号
答案 3 :(得分:-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$
同时比较两种外壳上shopt选项(man bash)的状态,也许其中一个有一些compat语法打开或关闭?没有args的“shopt”命令将列出支持的选项状态。