Comment dire à bash que la ligne continue sur la ligne suivante

99

Dans un script bash que j'ai reçu d'un autre programmeur, certaines lignes dépassaient 80 colonnes. Quel est le caractère ou la chose à ajouter à la ligne pour indiquer que la ligne continue sur la ligne suivante?

Ouvrez la voie
la source
Voir la discussion supplémentaire sur stackoverflow.com/questions/18599711/…
enharmonic

Réponses:

127

Le caractère est une barre oblique inverse \

À partir du manuel bash :

La barre oblique inverse '\' peut être utilisée pour supprimer toute signification spéciale pour le prochain caractère lu et pour la continuation de ligne.

Guillaume
la source
Merci. et quelle est la limite habituelle dans les colonnes d'un script bash?
Ouverture le
bash n'a pas de limite de colonne intéressante; pour plus de clarté, vous devriez essayer de limiter à 70-80 caractères par colonne.
Habbie
9
@RyanM La barre oblique inverse doit être le tout dernier caractère avant le caractère de fin de ligne. Êtes-vous sûr de ne pas avoir d'espace après le \?
George
9
@George Ouais. Un peu plus de bidouillage crache une erreur avec un ^M. Le problème semble être que le script m'a été donné par quelqu'un qui utilise Windows. Une solution rapide dos2unix:)
RyanM
2
@George votre commentaire m'a sauvé, j'avais un espace après le \ et je ne pouvais pas comprendre ce qui n'allait pas. À votre santé!
ffledgling
37

En général, vous pouvez utiliser une barre oblique inverse à la fin d'une ligne pour que la commande passe à la ligne suivante. Cependant, il existe des cas où les commandes sont implicitement continuées, à savoir lorsque la ligne se termine par un jeton qui ne peut pas légalement terminer une commande. Dans ce cas, le shell sait que plus est à venir, et la barre oblique inverse peut être omise. Quelques exemples:

# In general
$ echo "foo" \
> "bar"
foo bar

# Pipes
$ echo foo |
> cat
foo

# && and ||
$ echo foo &&
> echo bar
foo
bar
$ false ||
> echo bar
bar

La continuation implicite entre guillemets est différente, mais liée. Dans ce cas, sans barre oblique inverse, vous ajoutez simplement une nouvelle ligne à la chaîne.

$ x="foo
> bar"
$ echo "$x"
foo
bar

Avec une barre oblique inverse, vous divisez à nouveau la ligne logique en plusieurs lignes logiques.

$ x="foo\
> bar"
$ echo "$x"
foobar
chepner
la source
Existe-t-il une liste formelle de telles situations, où une commande est implicitement poursuivie sur la ligne suivante? Il me semble que je pouvais quitter la barre oblique inverse dans certaines circonstances , dans une [[- ]]condition, mais pas dans d' autres, et je suis en train de comprendre les règles.
Menachem le
16

\Fait le travail. La réponse de @ Guillaume et le commentaire de @ George répondent clairement à cette question. Ici, j'explique pourquoi The backslash has to be the very last character before the end of line character.Considérez cette commande:

   mysql -uroot \
   -hlocalhost      

S'il y a un espace après \, la continuation de ligne ne fonctionnera pas. La raison en est que cela \ supprime la signification spéciale du caractère suivant qui est un espace et non le caractère de saut de ligne invisible. Le caractère de saut de ligne est après l'espace pas \dans cet exemple.

Jingguo Yao
la source
2
Merci d'avoir signalé la partie "tout dernier personnage". J'étais un peu frustré de suivre exactement ce bug.
Jason