我最近从 14.04.3 LTS 更新到 16.04.2 LTS。我在 14 版本上执行的 shell scipts 在最新版本(即 16.04.2)中失败。
以下是错误示例:
test: 24: test: function: not found
test: 25: [: Illegal number: !
test.sh: 33: test.sh: Syntax error: "}" unexpected
这些行在脚本中包含以下信息
24 line : function CheckErrors {
25 line : if [ ! $1 -eq 0 ];
then
echo "****************************************"
echo "STEP FAILED: $2 "
echo "Terminating execution and exiting "
echo "****************************************"
exit 1
fi
33 line : }
两个版本之间有什么变化吗?
答案1
首先,我会将您的脚本语法更改为:
CheckErrors(){
if [ $1 -dt 0 ];
then
echo "****************************************"
echo "STEP FAILED: $2 "
echo "Terminating execution and exiting "
echo "****************************************"
exit 1
fi
}
这应该使您的脚本在更新过程中不易出错:
function
关键字是可选的(并且是“bashism”)。代替使用func(){commandA; commandB }
。这会使您的脚本更加可移植/bin/sh
如果在升级过程中发生外壳更改( );- 你不需要估价如果结果不为零(
if [ ! $1 -eq 0 ]
)。评估结果是否不同,则 (-dt
) 为零 (if [ $1 -dt 0 ]
)。
我怀疑您bash
在升级之前使用 shell 作为默认值/bin/sh
,因为dash
需要()
在函数名称末尾添加 ,而 for 则bash
足以包含()
、function
关键字或两者。看一眼这个例子bash
脚本的:
#!/bin/bash
function quit {
exit
}
function hello {
echo Hello!
}
hello
quit
echo foo
错误行test: 24: test: function: not found
让我怀疑你是否真的在使用bash
,所以......
我的答案:将 shebang 放在指向#!/bin/bash
并使用的脚本上./test.sh
运行它或遵循这个询问 Ubuntu 解决方案。