函数不适用于sh(但适用于bash)

时间:2015-09-29 07:07:32

标签: bash function sh

当我编写一个定义了函数的shell脚本时,我发现使用sh执行时出错,并使用bash得到正确的答案。这是一个演示:

test.sh的内容

#!/bin/sh 
function hello {
   echo "hello $1"
}
hello world

“bash test.sh”的输出是:hello world

“sh test.sh”的输出会给我错误。

当脚本包含已定义的函数时,为什么sh无法获得正确的答案?我没有在网上找到答案。谢谢!

更新: 在我摆脱“function”关键字后,我发现了另一个问题。事实证明,在Ubuntu中,sh与dash相关联。破折号的语法与bash略有不同。

  1. 定义函数时,请避免使用关键字“function”,此格式由ksh引入。

  2. 比较两个字符串时,请避免使用“==”。只需使用“=”来比较两个字符串。

  3. 还有更多变化。请参考以下链接:

    https://wiki.ubuntu.com/DashAsBinSh

1 个答案:

答案 0 :(得分:7)

Bash和sh不会使用完全相同的语言。

#!/bin/sh
hello() {
 echo "hello $1"
}

hello "world"

请注意功能定义中缺少function关键字和()

关于function关键字:POSIX specifies that a function definition has this form

fname() compound-command[io-redirect ...]

(请注意,没有function个关键字)。此外,在Reserved Words section中您会找到:

  

以下单词在某些实现中可能被识别为保留字(当没有引用任何字符时),导致未指定的结果:

     

[[ ]] function select

因此,如果您想要一个便携式功能定义,请不要使用function关键字。

使用互联网了解更多信息,但要了解这些差异,以了解如何为sh编写工作脚本。