J'écris un script d'installation qui sera exécuté en tant que /bin/sh
.
Une ligne demande un fichier:
read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY
Je voudrais diviser cette longue ligne en plusieurs lignes afin qu'aucune d'entre elles ne dépasse 80 caractères. Je parle des lignes dans le code source du script; pas sur les lignes qui doivent être réellement imprimées à l'écran lors de l'exécution du script!
Ce que j'ai essayé:
Première approche:
read -p "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " REPLY
Cela ne fonctionne pas car il n'imprime pas
Would you like to add this feature? [Y|n]
.Deuxième approche:
echo "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " read REPLY
Ça ne marche pas aussi bien. Il imprime une nouvelle ligne après l'invite. L'ajout d'une
-n
optionecho
n'aide pas: elle imprime simplement:-n goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] # empty line here
Ma solution de contournement actuelle est
printf '%s %s ' \ "goat can try change directory if cd fails to do so." \ "Would you like to add this feature? [Y|n] " read REPLY
et je me demande s'il y a une meilleure façon.
N'oubliez pas que je recherche une /bin/sh
solution compatible.
shell
shell-script
string
newlines
bourne-shell
Mateusz Piotrowski
la source
la source
Réponses:
Tout d'abord, découplons la lecture de la ligne de texte en utilisant une variable:
De cette façon, le problème devient: Comment affecter deux lignes à une variable.
Bien sûr, une première tentative pour ce faire est:
Écrit comme ça, le var
a
obtient réellement la valeurline-1 line-2
.Mais vous n'aimez pas le manque d'indentation que cela crée, eh bien, alors nous pouvons essayer de lire les lignes dans le var à partir d'un document ici (sachez que les lignes en retrait à l'intérieur du document ici ont besoin d'un onglet, pas d'espaces, pour fonctionner correctement):
Mais cela échouerait car en réalité deux lignes sont écrites sur
$a
. Une solution de contournement pour obtenir une seule ligne peut être:C'est proche, mais cela crée d'autres problèmes supplémentaires.
Solution correcte.
Toutes les tentatives ci-dessus ne feront que rendre ce problème plus complexe qu'il ne doit l'être.
Une approche très basique et simple est:
Le code de votre exemple spécifique est (pour tout shell dont les
read
supports-p
):Pour tous les autres coques, utilisez:
la source
La barre oblique inversée à la fin des lignes permet la poursuite de la commande sur plusieurs lignes, et non des sauts de ligne réels dans la sortie.
Ainsi, votre première approche, par exemple, devient la commande
Je ne sais pas pourquoi vous voulez lire pour produire plusieurs lignes, mais j'utiliserais simplement
read
la ligne d'invite etecho
la ou les lignes précédentes.Pour rendre le code plus lisible sur plusieurs lignes, ne fermez pas / n'ouvrez pas vos guillemets entre les lignes.
Essaye ça:
la source
read
est indenté dans une fonction, votre approche semble gâcher la lisibilité.Je trouve l'approche de @ BinaryZebra utilisant une variable plus propre, mais vous pouvez également le faire comme vous le tentiez. Il vous suffit de conserver les sauts de ligne à l'intérieur des guillemets:
la source
\n
dans mon invite. Je voulais juste diviser le code en plusieurs lignes afin que chaque ligne contienne au plus 80 caractères.Et à ce sujet:
la source