70 votes

Comment briser une chaîne littérale extrêmement longue en bash?

Je voudrais intégrer une longue commande comme celle-ci dans un script bash :

 mycommand \
    --server myserver \
    --filename extremely/long/file/name/that/i/would/like/to/be/able/to/break/up/if/possible \
    --otherflag \
    --anotherflag

avec le nom de fichier long brisé.

je pourrais faire ça :

 # Insufficiently pretty
mycommand \
    --server myserver \
    --filename extremely/long/file/name/\
that/i/would/like/to/be/able/to/break/\
up/if/possible \
    --otherflag \
    --anotherflag \

mais ça casse le courant. Je voudrais pouvoir écrire ceci:

 # Doesn't work
mycommand \
    --server myserver \
    --filename extremely/long/file/name/\
         that/i/would/like/to/be/able/to/break/\
         up/if/possible \
    --otherflag \
    --anotherflag

mais cela ne fonctionne pas car cela brise le littéral de chaîne.

Existe-t-il un moyen de dire à bash de casser un littéral de chaîne mais d'ignorer les espaces de début?

87voto

Chriszuma Points 2770

C'est un peu bidouille, mais ça marche :

 mycommand \
    --server myserver \
    --filename "extremely/long/file/name/"`
               `"that/i/would/like/to/be/able/to/break/"`
               `"up/if/possible" \
    --otherflag \
    --anotherflag

Bash concatène les littéraux de chaîne adjacents, nous en profitons donc. Par exemple, echo "hi" "there" imprime hi there alors que echo "hi""there" imprime hithere .

Il tire également parti de l'opérateur backtick et du fait qu'un tas d'espaces n'évalue rien.

74voto

WilQu Points 3010

Vous pouvez utiliser une variable :

 file=extremely/long/file/name
file+=/that/i/would/like/to/be/able/to/break
file+=/up/if/possible

mycommand\
    --server myserver\
    --filename $file\
    --flag flag

3voto

tworec Points 1676

On peut aussi utiliser une variable tableau

 file=(extremely/long/file/name
    /that/i/would/like/to/be/able/to/break
    /up/if/possible)
IFS=''

echo mycommand\
    --server myserver\
    --filename "${file[*]}"\
    --flag flag

2voto

Peter.O Points 1911

Fondamentalement, il n'y a rien de intégré dans bash pour faire cela. Un wrapper est généralement plus problématique qu'il n'en vaut la peine, mais cela dit, vous pouvez essayer un alias ou une fonction, par exemple. j

 j(){sed -e ':a;$!N;s/ *\n *//g;ta' <<<"$1"}

echo "$(j "3   spaces  
           /hello
           /world
           /this
           /is
           /a
           /long
           /path
          ")"

# 3   spaces/hello/world/this/is/a/long/path

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X