最近、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ソリューションに尋ねる。