シェルスクリプトには興味深いバグがあります

シェルスクリプトには興味深いバグがあります

私はbashGNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)とDebianの最新のダッシュアクション(ダッシュバージョンを取得する方法?)でこの動作を見つけました。

エラーは次のとおりです。

/bin/echo "Silent Err 'unexpected EOF while looking for matching' Example:"

if [ 0 -eq 1 ]; then
        /bin/echo "HERE IS MISTAKE WITHOUT QUOTE IN THE END
        exit
fi

/bin/echo " BLACK HOLE "
/bin/echo " CODE WILL NEVER PROCEED "

if [ 0 -eq 1 ]; then
        /bin/echo "SECOND MISTAKE
        exit
fi
/bin/echo "normal code... will work";
/bin/echo "Good and silent exit without any notice about BLACK HOLE code..."
/bin/echo "exit."

放射:

# bash bug_as_is.sh 
Silent Err 'unexpected EOF while looking for matching' Example:
normal code... will work
Good and silent exit without any notice about BLACK HOLE code place...
exit.

if then fiエラーは、最初のブロックが参照されたときにのみ発生します。

# bash unbug.sh 
Silent Err 'unexpected EOF while looking for matching' Example:
 BLACK HOLE 
 CODE WILL NEVER PROCEED 
unbug.sh: line 20: unexpected EOF while looking for matching `"'
unbug.sh: line 24: syntax error: unexpected end of file

これはよく知られているエラーですか、それとも私が本物のダイヤモンドを見つけましたか? (;;

この行動の根拠は何ですか?

ベストアンサー1

Bashにエラーがありません。コードが正常に動作します。

echobashは、文字列が奇妙に見え、bashコードを含む場合でも、複数行の文字列を引数として受け入れます。

以下は、echo複数行の文字列出力を含むステートメントです。

        /bin/echo "HERE IS MISTAKE WITHOUT QUOTE IN THE END
        exit
fi

/bin/echo " BLACK HOLE "
/bin/echo " CODE WILL NEVER PROCEED "

if [ 0 -eq 1 ]; then
        /bin/echo "SECOND MISTAKE

これを明確にするために長い文字列を"multiline string omitted"。まあ、コードは簡単です:

/bin/echo "Silent Err 'unexpected EOF while looking for matching' Example:"

if [ 0 -eq 1 ]; then
        /bin/echo "multiline string omitted"
        exit
fi
/bin/echo "normal code... will work";
/bin/echo "Good and silent exit without any notice about BLACK HOLE code..."
/bin/echo "exit."

上記のコードは正常に動作するコードです。

おすすめ記事