分页: 1 / 1

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

发表于 : 2018-07-07 18:07
去也无踪
无论是使用gedit还是cat写一个sh函数均提示语法错误。百度sh函数语法核对后没有发现问题。

例如

代码: 全选

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

代码: 全选

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

系统为18.04 LTS

Re: sh的语法错误提示

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

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

哦,对了,你最好ls -l /bin/sh看一眼结果,我记得ubuntu上默认sh是dash不是bash,如果你要用bash,请把第一行改成#!/bin/bash

Re: sh的语法错误提示

发表于 : 2018-07-07 19:49
astolia
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