複数のステートメント行を繰り返すと、予期しない完了マークの近くに構文エラーがあります。

複数のステートメント行を繰り返すと、予期しない完了マークの近くに構文エラーがあります。

大きなファイルの一部として、次のコードがあります(グローバル変数と見なされます)${tools_urls}${tempFolder}

download_tools()
{
    for i in ${tools_urls}; do
        wget --no-check-certificate --directory-prefix=${tempFolder} ${i} || { echo "download failed" ; exit 3}
    done
}

スクリプトを実行すると、次のエラーが発生します。

syntax error near unexpected token 'done'

しかし、|| { echo "download failed" ; exit 3}ループの一部を削除すると機能します。

なぜですか?私のコードにどのような問題があるのか​​わからず、1行に複数のステートメントを含む同様の例が見つかりませんでした。

答え1

複合コマンド中かっこ付きの各コマンドの後にはセミコロンが続く必要があります。

{ cmd1; cmd2; cmd3; }

したがって、次のように変更してください。

... || { echo "download failed" ; exit 3; }

最後のコマンドの後にはスペースが必要です。

中かっこは次のとおりです。予約語したがって、次のように一致する必要があります。リスト(コマンド)は、スペースやその他のシェルメタ文字で構成されます。


また、変数を引用する必要があります。

wget --no-check-certificate --directory-prefix="${tempFolder}" "${i}"

関連情報