[シェルプログラミング】シェルスクリプトの実行エラー: シンタックスエラー: 予期せぬファイルの終了
最近、ブログ主がシェルスクリプトを書いていて、書いてから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++などのシェル構文強調表示機能を持つエディタを使用して、明らかな構文上の問題を探し、修正します。
関連
-
スクリプトが ssh を呼び出した後、stdin がターミナルでないため、疑似ターミナルが割り当てられない
-
Makefileを参照してください。***セパレータがない。 停止 原因と解決策
-
SSHパスワードフリーログイン設定後、stdinがターミナルでないため、疑似ターミナルが割り当てられない。
-
psycopgのアセンブルはエラーになります。Error: pg_config 実行ファイルが見つかりません。
-
警告について:互換性のないポインタ型からの初期化【デフォルトで有効
-
centos 7.2 make: *** `default' が必要とする `build' をターゲットとするルールがありません。停止します。
-
シェルスクリプトに$0, $? , $! , $$, $*, $#, $@ などのシェルスクリプトとlinuxコマンド実行時の戻り値の意味
-
エラーとなったシェルスクリプトを実行します。"予期しないトークン付近の構文エラーに対する解決策`"
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
centos - centos7 で Python プログラムをバックグラウンドで実行する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
LinuxでのPythonとpipのインストールと "AttributeError: module 'pip.__main__' has no attribute '_main'エラー"
-
アクセスが拒否されました。PROCESS 特権が(少なくとも1つ)必要です。
-
linuxのインストールファイルでは、configure: error: no acceptable C compiler found in $PATH errorが表示されます。
-
[エラーログ】シェルスクリプトによって報告された曖昧なリダイレクトを解決する
-
変数 `xxx' の解は、初期化子を持っているが型が不完全である。
-
プログラム下部の2つのスイスアーミーナイフをこじ開ける
-
Linuxの一般的なコマンドを史上最も完璧にまとめた本(超充実! (超詳しい!)これだけ集めれば十分!?
-
PackagesNotFoundError: 以下のパッケージは、現在のチャネルから利用できません。
-
centos - centos7でcrontabを使用してmysqlのスケジュールバックアップを行う。
-
dpkg: パッケージの処理エラー ***(--install): 依存関係の問題 - 未設定にする