web-dev-qa-db-fra.com

Bash: fractionner l'argument chaîne longue en plusieurs lignes?

Étant donné une commande qui prend un seul argument de chaîne longue comme:

mycommand -arg1 "very long string which does not fit on the screen"

est-il possible de le diviser d'une manière similaire à la façon dont les arguments séparés peuvent être divisés avec \.

J'ai essayé:

mycommand -arg1 "very \
    long \
    string \
    which ..."

mais cela ne fonctionne pas.

mycommand est une commande externe et ne peut donc pas être modifiée pour prendre des arguments uniques.

17
ccpizza

Vous pouvez affecter votre chaîne à une variable comme celle-ci:

long_arg="my very long string\
 which does not fit\
 on the screen"

Ensuite, utilisez simplement la variable:

mycommand "$long_arg"

Dans les guillemets doubles, une nouvelle ligne précédée d'une barre oblique inverse est supprimée. Notez que tous les autres espaces blancs de la chaîne sont significatifs, c'est-à-dire qu'ils seront présents dans la variable.

23
Tom Fenech

Avez-vous essayé sans les guillemets?

$ foo() { echo -e "1-$1\n2-$2\n3-$3"; }

$ foo "1 \
2 \
3"

1-1 2 3
2-
3-

$ foo 1 \
2 \ 
3

1-1
2-2
3-3

Lorsque vous l'encapsulez entre guillemets doubles, cela respecte votre barre oblique inverse et ignore le caractère suivant, mais comme vous encapsulez le tout entre guillemets, cela fait penser que le bloc de texte entier entre guillemets doit être traité comme un seul argument.

2
Eremite