バージョンは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のシェルスクリプトの実行は、最新バージョン(例: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 : }

2つのバージョン間に変更がありますか?

ベストアンサー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)は0(if [ $1 -dt 0 ])になります。

bashアップグレードする前にシェルをデフォルトとして使用していたようです。これは、関数名の末尾に追加する必要があり、for キーワードで十分か、または両方であるため/bin/shです。見てdash()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ソリューションに尋ねる

おすすめ記事