当我编写一个定义了函数的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略有不同。
定义函数时,请避免使用关键字“function”,此格式由ksh引入。
比较两个字符串时,请避免使用“==”。只需使用“=”来比较两个字符串。
还有更多变化。请参考以下链接:
答案 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编写工作脚本。