Comment utilisez-vous les lignes de continuation bash?
Je réalise que vous pouvez faire ceci:
echo "continuation \
lines"
>continuation lines
Cependant, si vous avez du code en retrait, cela ne fonctionne pas si bien:
echo "continuation \
lines"
>continuation lines
bash
line
indentation
PyRulez
la source
la source
Réponses:
C'est ce que tu veux peut-être
Si cela crée deux arguments à écho et que vous n'en voulez qu'un, alors regardons la concaténation de chaînes. Dans bash, placer deux chaînes côte à côte concaténent:
Ainsi, une ligne de continuation sans retrait est un moyen de rompre une chaîne:
Mais lorsqu'un retrait est utilisé:
Vous obtenez deux arguments car il ne s'agit plus d'une concaténation.
Si vous souhaitez une seule chaîne qui traverse les lignes, tout en indentant mais sans obtenir tous ces espaces, une approche que vous pouvez essayer est d'abandonner la ligne de continuation et d'utiliser des variables:
Cela vous permettra d'avoir un code clairement indenté au détriment de variables supplémentaires. Si vous rendez les variables locales, cela ne devrait pas être trop grave.
la source
s="string no. 1" s+="string no. 2" s+=" string no. 3" echo "$s"
Ici, les documents avec le
<<-HERE
terminateur fonctionnent bien pour les chaînes de texte sur plusieurs lignes indentées. Cela supprimera tous les onglets de début du document ici. (Les terminaisons de ligne resteront cependant toujours.)Voir aussi http://ss64.com/bash/syntax-here.html
Si vous avez besoin de conserver certains espaces, mais pas tous, vous pouvez utiliser quelque chose comme
ou peut-être utiliser
tr
pour se débarrasser des nouvelles lignes:(La deuxième ligne a une tabulation et un espace à l'avant; la tabulation sera supprimée par l'opérateur de tiret avant le terminateur heredoc, tandis que l'espace sera conservé.)
Pour envelopper de longues chaînes complexes sur de nombreuses lignes, j'aime
printf
:Cela fonctionne également bien dans les contextes où vous souhaitez incorporer des éléments non triviaux de script shell dans un autre langage où la syntaxe du langage hôte ne vous permettra pas d'utiliser un document here, comme dans un
Makefile
ouDockerfile
.la source
printf
exemple maintenant.)Vous pouvez utiliser des tableaux bash
puis
il y a un espace supplémentaire, car (après le manuel bash):
Alors prêt
IFS=''
à se débarrasser de l'espace supplémentairela source
Dans certains scénarios, l'utilisation de la capacité de concaténation de Bash peut être appropriée.
Exemple:
Dans la section PARAMÈTRES de la page Bash Man:
la source
Je suis tombé sur une situation dans laquelle je devais envoyer un long message dans le cadre d'un argument de commande et je devais respecter la limite de longueur de ligne. Les commandes ressemblent à ceci:
La façon dont j'ai résolu ce problème est de déplacer le message en tant que document ici (comme @tripleee suggéré). Mais un document ici devient un stdin, il doit donc être relu, je suis allé avec l'approche ci-dessous:
Cela a l'avantage de
$message
pouvoir être utilisé exactement comme constante de chaîne sans espace supplémentaire ni saut de ligne.Notez que les lignes de message ci-dessus sont précédées d'un
tab
caractère chacune, qui est supprimé par ici le document lui-même (en raison de l'utilisation de<<-
). Il y a encore des sauts de ligne à la fin, qui sont ensuite remplacés pardd
des espaces.Notez également que si vous ne supprimez pas les nouvelles lignes, elles apparaîtront telles quelles lors du
"$message"
développement. Dans certains cas, vous pourrez peut-être contourner le problème en supprimant les guillemets$message
, mais le message ne sera plus un argument unique.la source
Les continuations de ligne peuvent également être obtenues grâce à une utilisation intelligente de la syntaxe.
Dans le cas de
echo
:Dans le cas des vars:
Une autre approche dans le cas des vars:
Voila!
la source
Vous pouvez simplement le séparer par des retours à la ligne (sans utiliser de barre oblique inverse) comme requis dans l'indentation comme suit et simplement supprimer les nouvelles lignes.
Exemple:
Ou s'il s'agit d'une définition de variable, les nouvelles lignes sont automatiquement converties en espaces. Donc, bande d'espaces supplémentaires uniquement le cas échéant.
la source
Ce n'est pas exactement ce que l'utilisateur a demandé, mais une autre façon de créer une longue chaîne qui s'étend sur plusieurs lignes est de la construire progressivement, comme ceci:
Évidemment, dans ce cas, il aurait été plus simple de le construire en une seule fois, mais ce style peut être très léger et compréhensible lorsqu'il s'agit de cordes plus longues.
la source
Essayez avec des guillemets simples et concaténant les chaînes:
Remarque: la concaténation comprend un espace.
la source
echo
si vous aviezx=
, vous obtiendrez l'erreur:lines: command not found
.En fonction du type de risques que vous accepterez et de la qualité de votre connaissance et de votre confiance dans les données, vous pouvez utiliser une interpolation de variable simpliste.
la source
Cela ne répond probablement pas vraiment à votre question, mais vous pourriez le trouver utile de toute façon.
La première commande crée le script affiché par la deuxième commande.
La troisième commande rend ce script exécutable.
La quatrième commande fournit un exemple d'utilisation.
Notez que si vous voulez vraiment utiliser ce script, il est plus logique de déplacer le script exécutable
~/bin
pour qu'il soit dans votre chemin.Consultez la référence python pour plus de détails sur son
textwrap.dedent
fonctionnement.Si l'utilisation de
$'...'
ou"$(...)"
est déroutante pour vous, posez une autre question (une par construction) s'il n'y en a pas déjà une. Il peut être intéressant de fournir un lien vers la question que vous trouvez / posez afin que d'autres personnes aient une référence liée.la source