Bashスクリプトで欠落している引用符を見つける最も簡単な方法は何ですか?

Bashスクリプトで欠落している引用符を見つける最も簡単な方法は何ですか?

現在、700行を超えるbashスクリプトがあります。特に長い編集作業を終えた後、次のエラーが発生します。

./run_me.sh: line 693: unexpected EOF while looking for matching `''
./run_me.sh: line 702: syntax error: unexpected end of file

しかし、693行には何の問題もありません。上記の引用はありません。

私はrunningを試しましたが、bash -x run_me.sh最後の行が実行されていることがわかりますが、その行には問題ありません(そしてその行と693の間のコードは実際にはほとんどのコードです)。

コード全体をコメントアウトできますが、そうすると、EOFエラーではなく、関数の欠落などによるエラーが発生する可能性が高くなります。

もしそうなら、行番号が誤って報告された場合、欠落している引用符をどのように見つけることができますか?

(Bashの行番号がなぜそんなに離れているのですか?)

編集する

ところで、私は(ストリップにコメントを付けて)私の特定のエラーを見つけました。このエラーは、}エラーメッセージが示す行の近くにまったくない任意の行番号の変数の拡張によって実際に失われました。ここでは、引用ベースの構文の強調表示は役に立ちません。たとえば、"${MY_ARRAY[@]"(必要がある)に欠けている中括弧があります"${MY_ARRAY[@]}"

ベストアンサー1

ローテックアプローチは

tr -cd "'\n" < run_me.sh | awk 'length%2==1 {print NR, $0}'

tr一重引用符と改行文字を除くすべての文字を削除し、awk奇数文字(一致しない引用符など)を含む行を識別します。個別に確認してください。有効な文字列が表示され"That's not a bug!"ます。

問題が強調表示されない場合は、tr -cd '"\n' (一致しない二重引用符を検索)を使用してもう一度やり直してください。  次に、trAllow()[]Final {} Pass を展開します。この時点で、出力を手動でチェックすることはあまり効率的ではありません。一方(、通常は同じ行で一致しますが、引用符と角かっこはほとんど常に一致しますが、  )そうではありません。 (ただし、不一致が見つかると、代わりに入力するOPの実際の問題が明らかになります。){}{}"${MY_ARRAY[@]""${MY_ARRAY[@]}"

問題の範囲を中括弧の不一致に絞り込んだ場合、特にファイル内の範囲を絞り込んだ場合は、計画Bに進みます。vim(または)でviファイルを開きます。{エラーが発生したと思う前に、その文字に移動してを入力してください%。カーソルが開始した位置と一致すると} 思われる位置に移動したら、{次の位置に移動して{繰り返します。開始位置}と一致しない位置にジャンプすると、2つの中{括弧の間にエラーが発生します。移動しない場合は、現在の場所とファイルの終わりの間にエラーが発生しました。大きくする。

このアプローチは、C、C ++、Java(コンパイラが不十分な場合)などの言語のプログラムファイルには少し適していますが、シェルスクリプトではかなりうまく機能します。

おすすめ記事