一致する ''' の検索中に予期しない EOF が発生しました - Bash スクリプト

一致する ''' の検索中に予期しない EOF が発生しました - Bash スクリプト

私はちょうどbashスクリプトを作成しましたが、このEOFエラーは引き続き発生します。

私のスクリプトは次のとおりです(OS Xのみ)。

#!/bin/bash

#DEFINITIONS BEGIN
en_sq() {
    echo -e "Enabling smart quotes..."
    defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool true
    status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
            if [ "$status" = "1" ]
                then
                    echo -e "Success! Smart quotes are now enabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
di_sq() {
    echo -e "Disabling smart quotes..."
    defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
    status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
            if [ "$status" = "0" ]
                then
                    echo -e "Success! Smart quotes are now disabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
en_sd() {
    echo -e "Enabling smart dashes..."
    defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool true
    status=$(defaults read NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool)
            if [ "$status" = "1" ]
                then
                    echo -e "Success! Smart dashes are now enabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
di_sd() {
    echo -e "Enabling smart dashes..."
    defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
    status=$(defaults read NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool)
            if [ "$status" = "0" ]
                then
                    echo -e "Success! Smart dashes are now disabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
#DEFINITIONS END
#---------------

#BEGIN OF CODE with properties
#This is only terminated if the user entered properties (eg ./sqd.sh 1 1)
if [ "$1" = "1" ]
    then
        en_sq
    elif [ "$1" = "0" ]
        then
            di_sq
fi

if [ "$2" = "1" ]
    then
        en_sd
        #exit 0 if both, $1 and $2 are correct entered and processed.
        exit 0
    elif [ "$1" = "0" ]
        then
            di_sd
            #exit 0 if both, $1 and $2 are correct entered and processed.
            exit 0
fi
#END OF CODE with properties
#---------------------------


#BEGIN OF CODE without properties
#This is terminated if the user didn't enter two properties
echo -e "\n\n\n\n\nINFO: You can use this command as following: $0 x y, while x and y can be either 0 for false or 1 for true."
echo -e "x is for the smart quotes, y for the smart dashes."
sleep 1
echo -e " \n Reading preferences...\n"
status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
if [ "$status" = "1" ]
    then
        echo -e "Smart quotes are enabled."
    elif [ "$status" = "0" ]
    then
        echo -e "Smart quotes are disabled."

    else
        echo -e "Sorry, an error occured. You have to run this on OS X""
fi

status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
if [ "$status" = "1" ]
    then
        echo -e "Smart dashes are enabled."
    elif [ "$status" = "0" ]
    then
        echo -e "Smart dashes are disabled."

    else
        echo -e "Sorry, an error occured. You have to run this on OS X!"
fi

sleep 3
echo -e "\n\n You can now enable or disable smart quotes."

until [ "$SUCCESS" = "TRUE" ]
do
echo -e "Enter e for enable or d for disable:"
read sq

if [ "$sq" = "e" ]
    then
        en_sq
    elif [ "$sq" = "d" ]
        then
            di_sq
    else
        echo -e "\n\n ERROR! Please enter e for enable or d for disable!"
fi
done
SUCCESS="FALSE"

echo -e "\n\n You can now enable or disable smart dashes."

until [ "$SUCCESS" = "TRUE" ]
do
echo -e "Enter e for enable or d for disable:"
read sq

if [ "$sd" = "e" ]
    then
        en_sd
    elif [ "$sd" = "d" ]
        then
            di_sd
    else
        echo -e "\n\n ERROR! Please enter e for enable or d for disable!"
fi
done

これは私のせいです:

./coding.sh: line 144: unexpected EOF while looking for matching `"'
./coding.sh: line 147: syntax error: unexpected end of file

答え1

質問を見ると問題が見えます。 95行目以降の構文の強調表示がどのように混乱しているかを確認してください。

echo -e "Sorry, an error occurred. You have to run this on OS X""

エラーメッセージが示すように、不一致があります""上記の行から余分な部分を削除してください。

echo -e "Sorry, an error occurred. You have to run this on OS X"

答え2

実際の状況では、このエラーを追跡するのは難しい場合があります。ここで私は実際の状況に対する解決策を提示します。私のスクリプトを例として使用します。

シェルスクリプトを更新しました。実行すると、次のエラーメッセージが表示されます。

/somepath/bin/myshellscript: line 1508: unexpected EOF while looking for matching `"'
/somepath/bin/myshellscript: line 1520: syntax error: unexpected end of file

line 1508 elif [ "$project" ]; then

これは二重引用符のペアがある最後の行です。

通常、私はシェルスクリプトを変更するたびにこれをチェックします。今回は一日待ってからどこで修正すべきか忘れてしまいました。この行(1508)の前部で問題が発生します。問題は私も概要1508にコメントしたということだ。

#elif [ "$project" ]; then

シェルランチャーはまだ1508行に問題があると言います。

次に、元のシェルスクリプトをコピーしました。下部から多くのコードを削除します。次に、次のコマンドを使用して私のコードを確認します。

bash -n mysbashscript

mybashscript: line 515: unexpected EOF while looking for matching `"'
mybashscript: line 561: syntax error: unexpected end of file

今私のファイルサイズは元のサイズの3分の1です。私はすぐに問題を発見しました。

497 prepare_alignment() {
498     local projdir=${1:?"did not give project directory"}
499     local samp=${2:?"did not give sample name"}
500     local merged=${3:?"must give merged bam file name} # here is the problem

何らかの理由で、シェルパーサーは"内部の不一致を捉えません。{}ここでシェルパーサーをさらに向上させることができます。

問題を見つける最速のアルゴリズムは、下からコードの半分を削除することです。構文エラーがなくなると、この半分になります。構文エラーが続く場合は、前半に問題があります。

後半に問題がある場合は削除をキャンセルしてください。この手順を繰り返します。範囲を絞り込んで問題の原因を見つけることができます。

コードを削除する場合は、コード全体を削除する必要があります。フル機能のような。

bashを使用する-n script_nameか、スクリプトを直接実行できます。どちらも動作するはずです。 (ここでscript_nameは説明のためのfooscriptまたはbarscriptにすぎず、実際のスクリプト名は1単語でなければなりません。)

答え3

中かっこがないため、このエラーが発生しました...

docker tag "${FOO" "${BOO}"

答え4

考慮すべきもう1つのことは、一部の主要文字がブロックを開始し、二重引用符が問題にならない可能性があることです。すべての変数を bash で中かっこで囲みましたが、誤って中かっこの代わりに角かっこを使用すると、このエラーが表示され、引用符はすべてがっかり並べ替えられます。 Kemin Zhouのプロセスを使ってこのタイプミスを見つけることができました。 echo "Starting $[report_name}" >> ${log}のように見えますecho "Starting ${report_name}" >> ${log}。二重引用符は問題ではありませんが、報道によるとそのような場合です。

関連情報