版本从 14.04.3 LTS 更新到 16.04.2 LTS

版本从 14.04.3 LTS 更新到 16.04.2 LTS

我最近从 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 解决方案

相关内容