[Script shell] Chaine repartie sur plusieurs lignes avec indentation

9 réponses
Avatar
Pascal Hambourg
Bonjour,

Un script shell contient une chaÍ®ne longue que je souhaite étaler sur
plusieurs lignes pour limiter la longueur des lignes du script. Pour le
moment je fais ça pour recoller les morceaux :

'partie 1'\
'partie 2'\
'partie 3'

Mais je ne peux pas faire d'indentation sinon les morceaux sont traités
comme des chaÍ®nes distinctes, donc ce n'est pas aligné avec le reste du
code et c'est laid.

Voyez-vous d'autres solutions qui permettent l'indentation, sans
utiliser de variable ?

9 réponses

Avatar
pehache
Le 15/02/2022 Í  09:25, Pascal Hambourg a écrit :
Bonjour,
Un script shell contient une chaÍ®ne longue que je souhaite étaler sur
plusieurs lignes pour limiter la longueur des lignes du script. Pour le
moment je fais ça pour recoller les morceaux :
'partie 1'
'partie 2'
'partie 3'
Mais je ne peux pas faire d'indentation sinon les morceaux sont traités
comme des chaÍ®nes distinctes, donc ce n'est pas aligné avec le reste du
code et c'est laid.
Voyez-vous d'autres solutions qui permettent l'indentation, sans
utiliser de variable ?

Si tu acceptes qu'une espace soit insérée entre les parties (je ne sais
pas pourquoi) :
$(echo 'partie 1'
'partie 2')
--
"...sois ouvert aux idées des autres pour peu qu'elles aillent dans le
même sens que les tiennes.", ST sur fr.bio.medecine
ST passe le mur du çon :
Avatar
Nicolas George
Pascal Hambourg , dans le message <sufo10$ea4$, a
écrit :
Bonjour,
Un script shell contient une chaÍ®ne longue que je souhaite étaler sur
plusieurs lignes pour limiter la longueur des lignes du script. Pour le
moment je fais ça pour recoller les morceaux :
'partie 1'
'partie 2'
'partie 3'
Mais je ne peux pas faire d'indentation sinon les morceaux sont traités
comme des chaÍ®nes distinctes, donc ce n'est pas aligné avec le reste du
code et c'est laid.

t=""
t="${t}partie 1"
t="${t}partie 2"
t="${t}partie 3"
Avatar
pehache
Le 15/02/2022 Í  11:02, Nicolas George a écrit :
Pascal Hambourg , dans le message <sufo10$ea4$, a
écrit :
Bonjour,
Un script shell contient une chaÍ®ne longue que je souhaite étaler sur
plusieurs lignes pour limiter la longueur des lignes du script. Pour le
moment je fais ça pour recoller les morceaux :
'partie 1'
'partie 2'
'partie 3'
Mais je ne peux pas faire d'indentation sinon les morceaux sont traités
comme des chaÍ®nes distinctes, donc ce n'est pas aligné avec le reste du
code et c'est laid.

t=""
t="${t}partie 1"
t="${t}partie 2"
t="${t}partie 3"

--> "sans utiliser de variable"
Avatar
Benoit Izac
Bonjour,
Le 15/02/2022 Í  10:02, pehache a écrit dans le message
 :
Un script shell contient une chaÍ®ne longue que je souhaite étaler
sur plusieurs lignes pour limiter la longueur des lignes du script.
Pour le moment je fais ça pour recoller les morceaux :
'partie 1'
'partie 2'
'partie 3'
Mais je ne peux pas faire d'indentation sinon les morceaux sont
traités comme des chaÍ®nes distinctes, donc ce n'est pas aligné avec
le reste du code et c'est laid.
Voyez-vous d'autres solutions qui permettent l'indentation, sans
utiliser de variable ?

Si tu acceptes qu'une espace soit insérée entre les parties (je ne
sais pas pourquoi) :
$(echo 'partie 1'
'partie 2')

echo voit deux arguments donc les sépare par une espace.
cmd "$(printf '%s'
'partie 1'
'partie 2')"
Une autre solution (il faut que ce soit des tabulations devant pour que
ça fonctionne) :
cmd "$(tr -d 'n' <<-'EOF'
partie 1
partie 2
partie 3
EOF
)"
--
Benoit Izac
Avatar
Jacques L'helgoualc'h
Le 15-02-2022, pehache a écrit :
Le 15/02/2022 Í  11:02, Nicolas George a écrit :
Pascal Hambourg , dans le message <sufo10$ea4$, a
écrit :
Bonjour,
Un script shell contient une chaÍ®ne longue que je souhaite étaler sur
plusieurs lignes pour limiter la longueur des lignes du script. Pour le
moment je fais ça pour recoller les morceaux :
'partie 1'
'partie 2'
'partie 3'
Mais je ne peux pas faire d'indentation sinon les morceaux sont traités
comme des chaÍ®nes distinctes, donc ce n'est pas aligné avec le reste du
code et c'est laid.

t=""
t="${t}partie 1"
t="${t}partie 2"
t="${t}partie 3"

--> "sans utiliser de variable"

~ $ echo "$(cat <<BLA |sed -ne 'H;${x;s/n[[:blank:]]*//g;p}'
tata tete
titi
toto
BLA
)"
:)
Avatar
tth
On 2/15/22 09:25, Pascal Hambourg wrote:
Bonjour,
Un script shell contient une chaÍ®ne longue que je souhaite étaler sur
plusieurs lignes pour limiter la longueur des lignes du script. Pour le
moment je fais ça pour recoller les morceaux :
'partie 1'
'partie 2'
'partie 3'
Mais je ne peux pas faire d'indentation sinon les morceaux sont traités
comme des chaÍ®nes distinctes, donc ce n'est pas aligné avec le reste du
code et c'est laid.
Voyez-vous d'autres solutions qui permettent l'indentation, sans
utiliser de variable ?

:/tmp$ cat multilignes.sh
echo $(printf "%s%s%s%s%sn"
"Alice"
"Bob"
"Charlie"
"Diana"
"Esther" )
:/tmp$ bash multilignes.sh
AliceBobCharlieDianaEsther
:/tmp$
--
+-------------------------------------------------------------------+
| sphinx of black quartz, judge my vow. |
+-------------------------------------------------------------------+
Avatar
Nicolas George
pehache , dans le message , a écrit :
--> "sans utiliser de variable"

J'avais occulté ça. Pourquoi pas en portant des gants de boxe pour taper le
code, tant qu'on y est ?
Avatar
Pascal Hambourg
Le 15/02/2022 Í  09:25, Pascal Hambourg a écrit :
Voyez-vous d'autres solutions qui permettent l'indentation, sans
utiliser de variable ?

Merci pour vos contributions. Je fais une réponse groupée.
Pourquoi sans utiliser de variable ? Parce que je sais faire avec, et
que j'espère trouver "mieux" (mais apparemment ce n'est pas gagné).
Mes critères sont lisibilité, robustesse (insensibilité Í  l'indentation
avec tabulation ou espace) et efficacité du code.
Oui, dans le cas présent l'insertion d'espaces au sens large
(tabulation, fin de ligne...) est acceptable.
Par contre je préfère éviter d'utiliser la commande echo dont le
comportement varie selon l'implémentation. Par exemple celle intégrée Í 
dash interprète comme un caractère d'échappement (option -e implicite,
et pas d'option -E pour l'annuler), et il y en a dans cette chaͮne. Je
lui préfère donc printf.
Je n'aime pas trop les constructions Í  base de <<. Certes <<- supprime
les tabulations en début de ligne, mais pas les espaces donc c'est fragile.
Concernant l'efficacité, je doute que l'utilisation de commandes (même
intégrées au shell) ou de redirections soit mieux qu'une variable.
Avatar
Pascal Hambourg
Le 15/02/2022 Í  14:00, Pascal Hambourg a écrit :
Le 15/02/2022 Í  09:25, Pascal Hambourg a écrit :
Mes critères sont lisibilité, robustesse (insensibilité Í  l'indentation
avec tabulation ou espace) et efficacité du code.
Oui, dans le cas présent l'insertion d'espaces au sens large
(tabulation, fin de ligne...) est acceptable.

Du coup je peux simplement écrire :
'partie 1
partie 2
partie 3'
et indenter Í  ma guise.
Mais dans le cas contraire, je retiens qu'il faut utiliser printf ou une
variable :
"$(printf %s 'partie 1'
'partie 2'
'partie 3')"
chaine='partie 1'
chaine="$chaine"'partie 2'
chaine="$chaine"'partie 3'