1. ホーム
  2. Linux

[シェルプログラミング】シェルスクリプトの実行エラー: シンタックスエラー: 予期せぬファイルの終了

2022-02-13 12:23:17

最近、ブログ主がシェルスクリプトを書いていて、書いてからlinux環境で実行したところ、なぜか以下のようなエラーが報告されたそうです。

昨夜はスクリプトが正常に動作していたのに、今朝になって論理的な判断をいくつか追加したら、エラーが報告されたのです!これは単に不可解なことです。

しかし、報告されているのは . /test-fail.sh: 29行目。 構文エラー : 予期しないファイルの終了 

これは シンタックスエラー ああ、確かにスクリプトパーサーは嘘をつかない、だって私だけが触っていない私の実行環境を使っているのだから。

以下は、この問題に対する私の考えと、その解決策です。

I. まず、私のプログラミング手法の説明です。

Windowsでsublimeエディタを使ってシェルスクリプトを書き、ubuntu20.04を使ってrsyncソフトウェアでLinux環境に同期させています。

普段からコードをコンパイルする際に、コードファイルのエンコードに問題があることがあるので、最初に疑ったのは Windowsのエンコード方法でしょうか? 例えば、DOS形式だと、linuxのdos2unixというツールを使ってunix形式に変換する必要がありますが、その際の主な印象は、改行の問題で、" \rn" が "\n" になってしまうことです。

linuxでは、ファイルの種類を確認するためのfileコマンドがあり、その問い合わせは以下のようになります。

何度か動作させると、どうにもならなくなります。では、次のステップに進みましょう。

次に、昨夜は問題なかったのに、数行のコードを追加したためにうまくいかなかったので、どんなコードを追加したかをよく見ておく必要があります。

不要なコードの干渉を導入するため、余計な内容を削除して再度スクリプトを掲載し


#! /bin/bash -e

MODULE=2
SUPPORT_MODULES=(1 2 3 4 5 6)
SUPPORT_MODULES_SOCS=(a b c d e f)

function get_soc_name_by_module_name()
{
	module=$1
	len=${#SUPPORT_MODULES[@]}
	i=0
	for((i=0;i<$len;i=i+1)); do
    		if [ $module = ${SUPPORT_MODULES[i]} ]; then
    			break
    		fi
    	done
	if [ $i = $len ]; then
		echo "Unsupport MODULE_NAME: $module"
		exit 1
	fi
	SOC_NAME=${SUPPORT_MODULES_SOCS[i]
}

echo "shell script start ... "
get_soc_name_by_module_name $MODULE
echo "SOC_NAME=$SOC_NAME, MODULE_NAME=$MODULE"
echo "shell script end ... "


 OK コードのロジックは簡単です:MODULE-NAMEを入力し、内蔵のマッピングテーブルに従って対応するSOC-NAMEを見つけます。

このコードを見て、一見すると同じことを疑問に思うのではないでしょうか、"。 このコードには何の問題もありません "!

しかし、それは、代わりに報告された [ 構文エラー ].

構文エラーとは、文法的に正しくない文章を書くことに他ならないので、例えば を付けずに 例えば 括弧は一致しません などがあります。

ふと思ったのですが、notepad++はシェルのシンタックスハイライトに対応していないのでしょうか?それを開けば、何が起こっているのかが簡単にわかるのでは?

試しにメモ帳++で開いてみると

予想通り、本末転倒です。

通常の括弧の色は9行目のようなもので、23行目の括弧は明らかに色が違っており、確かに構文に問題があることを証明しています。

よくよく調べてみると、22行目の最後であることが判明しました } が23行目にキャリッジリターンされたため、22行目が不完全に記述されました。

OK。22行目には } で、終了です。

 変更後、手を動かしてテストしてみるとOKです。

改めて比較すると、本当にお花畑の括りで人をねじ伏せるだけなんですね。

さて、今号はここまでです。

要約すると、シンタックスエラー:予期しないファイルの終了

1) このエラーが発生した場合、まずファイルのエンコーディングを確認し、問題がなければ、リストの下に進んでください。

2) notepad++などのシェル構文強調表示機能を持つエディタを使用して、明らかな構文上の問題を探し、修正します。