124 votes

un document ici donne une erreur de type "fin de fichier inattendue".

J'ai besoin de mon script pour envoyer un email depuis le terminal. Sur la base de ce que j'ai vu ici et à de nombreux autres endroits en ligne, je l'ai formaté comme ceci :

/var/mail -s "$SUBJECT" "$EMAIL" << EOF
Here's a line of my message!
And here's another line!
Last line of the message here!
EOF

Cependant, lorsque je l'exécute, je reçois cet avertissement :

myfile.sh: line x: warning: here-document at line y delimited by end-of-file (wanted 'EOF')

myfile.sh: line x+1: syntax error: unexpected end of file

... où la ligne x est la dernière ligne de code écrite dans le programme, et la ligne y est la ligne avec /var/mail en elle. J'ai essayé de remplacer EOF avec d'autres choses ( ENDOFMESSAGE , FINISH etc.) mais en vain. Presque tout ce que j'ai trouvé en ligne a été fait de cette façon, et je suis vraiment nouveau à bash donc j'ai du mal à le comprendre par moi-même. Quelqu'un peut-il m'aider ?

0voto

danisheater Points 1

Quand je veux avoir docstrings pour mes fonctions bash, j'utilise une solution similaire à la suggestion de utilisateur12205 dans un duplicate de cette question.

Voyez comment je définis l'USAGE pour une solution qui :

  • s'auto-formate bien pour moi dans mon IDE de choix (sublime)
  • est multi-lignes
  • peut utiliser des espaces ou des tabulations comme indentation
  • préserve les indentations dans le commentaire.

    function foo {

    Docstring

    read -r -d '' USAGE <<'    END'
        # This method prints foo to the terminal.
        #
        # Enter `foo -h` to see the docstring.
        #      It has indentations and multiple lines.
        #
        # Change the delimiter if you need hashtag for some reason.
        # This can include $$ and = and eval, but won't be evaluated
    END
    
    if [ "$1" = "-h" ]
    then
        echo "$USAGE" | cut -d "#" -f 2 | cut -c 2-
        return
    fi
    
    echo "foo"

    }

Alors foo -h rendements :

This method prints foo to the terminal.

Enter `foo -h` to see the docstring.
     It has indentations and multiple lines.

Change the delimiter if you need hashtag for some reason.
This can include $$ and = and eval, but won't be evaluated

Explication

cut -d "#" -f 2 : Récupérer la deuxième partie de la # lignes délimitées. (Pensez à un csv avec "#" comme délimiteur, première colonne vide).

cut -c 2- : Récupérer le caractère 2 à la fin de la chaîne de caractères résultante.

Notez également que if [ "$1" = "-h" ] est évalué comme False s'il n'y a pas de premier argument, sans erreur, puisqu'il devient une chaîne vide.

0voto

uspinar Points 485

Assurez-vous que vous mettez la fin EOF au début d'une nouvelle ligne.

-1voto

psychoslave Points 929

Voici une manière souple de traiter les lignes multiples indentées sans en utilisant heredoc.

  echo 'Hello!'
  sed -e 's:^\s*::' < <(echo '
    Some indented text here.
    Some indented text here.
  ')
  if [[ true ]]; then
    sed -e 's:^\s\{4,4\}::' < <(echo '
      Some indented text here.
        Some extra indented text here.
      Some indented text here.
    ')
  fi

Quelques remarques sur cette solution :

  • si le contenu doit comporter des guillemets simples, il faut soit les échapper en utilisant \ ou remplacer les délimiteurs de chaîne par des guillemets doubles. Dans ce dernier cas, il faut veiller à ce que des constructions telles que $(command) seront interprétés. Si la chaîne de caractères contient à la fois des guillemets simples et doubles, vous devrez échapper au moins l'un d'entre eux.
  • l'exemple donné imprime une ligne vide à la fin, il y a de nombreuses façons de s'en débarrasser, qui ne sont pas incluses ici pour garder la proposition à un minimum d'encombrement.
  • la flexibilité vient de la facilité avec laquelle vous pouvez contrôler la quantité d'espace de tête qui doit rester ou disparaître, à condition que vous connaissiez quelques REGEXP sed bien sûr.

-2voto

YOLO ROFL Points 19

En plus des autres réponses mentionnées par Barmar et Joni, j'ai remarqué que je dois parfois laisser une ligne blanche avant et après mon EOF lorsque j'utilise <<-EOF .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X