[已解决]sh的语法错误提示

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
头像
去也无踪
帖子: 28
注册时间: 2013-11-16 20:03

[已解决]sh的语法错误提示

#1

帖子 去也无踪 » 2018-07-07 18:07

无论是使用gedit还是cat写一个sh函数均提示语法错误。百度sh函数语法核对后没有发现问题。

例如

代码: 全选

#!/bin/sh
function fun1()
{
}
则提示第2行"("语法错误。

代码: 全选

#!/bin/sh
fun1()
{
}
则提示第4行"}"语法错误。

系统为18.04 LTS
上次由 去也无踪 在 2018-07-19 9:39,总共编辑 1 次。
onlylove
论坛版主
帖子: 5208
注册时间: 2007-01-14 16:23

Re: sh的语法错误提示

#2

帖子 onlylove » 2018-07-07 18:41

如果你要用function关键字,貌似函数名后面不要加括号,至于第二个,里面塞一条命令,或者把花括号放一行,具体的可以等别人来回答

http://www.tldp.org/LDP/abs/html/functions.html

哦,对了,你最好ls -l /bin/sh看一眼结果,我记得ubuntu上默认sh是dash不是bash,如果你要用bash,请把第一行改成#!/bin/bash
头像
astolia
论坛版主
帖子: 6386
注册时间: 2008-09-18 13:11

Re: sh的语法错误提示

#3

帖子 astolia » 2018-07-07 19:49

1、你shebang里要写/bin/sh,就只能用posix shell的语法,否则不同发行版中的/bin/sh不见得会认,比如ubuntu默认的/bin/sh是dash就不认function fun1()这种非posix shell的语法。
posix shell的函数定义语法是

代码: 全选

name() compound-command [redirection]
bash还支持function这种

代码: 全选

function name [()] compound-command [redirection]
要么你改成去掉function的形式,要么你换成/bin/bash等支持这种写法的shell。对bash而言,function后面的()可以省略,加上也不影响

2、从上面的函数语法可以看到,函数体部分都是复合命令(compound command),所以要遵循复合命令的语法,posix shell的复合命令有以下几种:( xxx )、{ xxx }、for循环、while循环、until循环、if语句、case语句
它们的一个共性是会产生一个退出状态码exit code,一个空的{}没有退出状态码,所以不属于复合命令
以下都是合法的函数定义语句,虽然一般都不会这么写

代码: 全选

a()(echo 1)
b()for i in 1 2 3;do echo $i;done
c()if [ $USER = "root" ];then echo root;else echo non-root;fi
bash支持其他的一些复合命令,具体见bash的manpage
回复