Comment puis-je sortir une chaîne multipline dans Bash sans utiliser plusieurs appels d'écho comme ceci:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
Je suis à la recherche d'un moyen portable de le faire, en utilisant uniquement les modules internes Bash.
echo >&2 ...
--help
(qui devrait aller à la sortie standard).printf
solution basée sur Gordon Davidson. Bien qu'il soit dans l'ombre des approchesecho
oucat
basées, il semble être beaucoup moins compliqué. Certes, la syntaxe `printf 'représente un peu une courbe d'apprentissage, mais j'aimeraisRéponses:
Ici, les documents sont souvent utilisés à cette fin.
Ils sont pris en charge dans tous les shells dérivés de Bourne, y compris toutes les versions de Bash.
la source
cat
n'est pas intégré.read -d '' help <<- EOF ...
pour lire la chaîne multiligne dans une variable, puis j'ai fait écho au résultat.ou vous pouvez le faire:
la source
Inspiré par les réponses perspicaces de cette page, j'ai créé une approche mixte, que je considère comme la plus simple et la plus flexible. Qu'est-ce que tu penses?
Tout d'abord, je définis l'utilisation dans une variable, ce qui me permet de la réutiliser dans différents contextes. Le format est très simple, presque WYSIWYG, sans avoir besoin d'ajouter de caractères de contrôle. Cela me semble raisonnablement portable (je l'ai exécuté sur MacOS et Ubuntu)
Ensuite, je peux simplement l'utiliser comme
ou encore mieux, lors de l'analyse des paramètres, je peux simplement y faire écho dans une ligne:
la source
echo "$__usage"
était nécessaire pour moi.echo $__usage
n'a pas marché.Utilisez l'
-e
option, puis vous pouvez imprimer un nouveau caractère de ligne avec\n
dans la chaîne.Échantillon (mais je ne sais pas s'il est bon ou non)
Ce qui est amusant, c'est que cette-e
option n'est pas documentée dans la page de manuel de MacOS alors qu'elle est toujours utilisable. Il est documenté dans la page de manuel de Linux .la source
echo
commande fournie par le système/bin/echo
, qui sur Mac OS n'a pas d'-e
option. lorsque vous utilisez bash sur ces systèmes, saecho
commande intégrée prend le relais. Vous pouvez le voir en tapant explicitement/bin/echo whatever
et en observant la différence de comportement. Pour voir la documentation du intégré, tapezhelp echo
./bin/echo
est souvent différent d'un OS à l'autre et différent de la fonction intégrée de Bashecho
.echo -e
n'est pas portable - par exemple, certaines implémentations d'écho afficheront le "-e" dans le cadre de la sortie. Si vous souhaitez la portabilité, utilisez plutôt printf. Par exemple, / bin / echo sur OS X 10.7.4 fait cela. L'écho intégré de l'IIRC était également bizarre sous 10.5.0, mais je ne me souviens plus des détails.echo -e
m'a mordu avant ... Certainement utiliserprintf
oucat
avec un hérédoc. La<<-
variante de la documentation ici est particulièrement agréable car vous pouvez supprimer l'indentation principale dans la sortie, mais le retrait pour la lisibilité dans le scriptComme je l'ai recommandé
printf
dans un commentaire, je devrais probablement donner quelques exemples de son utilisation (bien que pour imprimer un message d'utilisation, je serais plus susceptible d'utiliser les réponses de Dennis ou Chris).printf
est un peu plus complexe à utiliser queecho
. Son premier argument est une chaîne de format, dans laquelle les échappements (comme\n
) sont toujours interprétés; il peut également contenir des directives de format commençant par%
, qui contrôlent où et comment tous les arguments supplémentaires y sont inclus. Voici deux approches différentes pour l'utiliser pour un message d'utilisation:Tout d'abord, vous pouvez inclure l'intégralité du message dans la chaîne de format:
Notez que contrairement à
echo
, vous devez inclure explicitement la nouvelle ligne finale. De plus, si le message contient des%
caractères, ils doivent être écrits sous la forme%%
. Si vous souhaitez inclure les adresses de rapport de bug et de page d'accueil, vous pouvez les ajouter tout naturellement:Deuxièmement, vous pouvez simplement utiliser la chaîne de format pour lui faire imprimer chaque argument supplémentaire sur une ligne distincte:
Avec cette option, l'ajout des adresses de rapport de bogue et de page d'accueil est assez évident:
la source
De plus, avec le code source en retrait, vous pouvez utiliser
<<-
(avec un tiret de fin) pour ignorer les tabulations en tête (mais pas les espaces en tête). Par exemple ceci:Génère du texte en retrait sans le premier espace blanc:
la source
Si vous utilisez la solution de @jorge et constatez que tout est sur la même ligne, assurez-vous de placer la variable entre guillemets:
imprimera tout sur une seule ligne alors que
conservera les nouvelles lignes.
la source
cat <<EOF .... EOF
&& echo "$ foo"