私は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
質問を見るだけで問題がわかります。構文の強調表示が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"
このエラーは、実際の状況では追跡が難しい場合があります。ここでは、実際の状況に対する1つのソリューションを提供します。例としてスクリプトを使用します。
シェルスクリプトを更新しました。実行すると、次のエラーメッセージが表示されました。
/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
これは、二重引用符のペアを持つ最後の行です。
通常、変更するたびにシェルスクリプトをチェックします。今回、私は1日待って、どこで変更を加えたか忘れました。問題はこの行(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
これで、ファイルは元のサイズの1/3になりました。私はすぐに問題を見ました:
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つのWordである必要があります)。