Comment spécifier une variable shell multi-ligne?

J’ai écrit une requête:

function print_ui_hosts { local sql = "select ........." print_sql "$ sql" } 

sql local – une très longue chaîne. La requête n’est pas formatée. Comment diviser une chaîne en plusieurs lignes?

Utilisez la read avec un heredoc comme indiqué ci-dessous:

 read -d '' sql < < EOF select c1, c2 from foo where c1='something' EOF echo "$sql" 

insérez simplement une nouvelle ligne si nécessaire

 sql=" SELECT c1, c2 from Table1, Table2 where ... " 

shell cherchera le guillemet fermant

Je voudrais donner une réponse supplémentaire, tandis que les autres suffiront dans la plupart des cas.

Je voulais écrire une chaîne sur plusieurs lignes, mais son contenu devait être simple ligne.

 sql=" \ SELECT c1, c2 \ from Table1, ${TABLE2} \ where ... \ " 

Je suis désolé si c’est un peu hors sujet (je n’en avais pas besoin pour SQL). Cependant, cette publication figure parmi les premiers résultats lors de la recherche de variables shell multilignes et une réponse supplémentaire semblait appropriée.

Grâce à la réponse de dimo414 à une question similaire , cela montre comment fonctionne cette excellente solution et montre que vous pouvez facilement append des citations et des variables dans le texte:

exemple de sortie

 $ ./test.sh The text from the example function is: Welcome dev: Would you "like" to know how many 'files' there are in /tmp? There are " 38" files in /tmp, according to the "wc" command 

test.sh

 #!/bin/bash function text1() { COUNT=$(\ls /tmp | wc -l) cat <  

read n’exporte pas la variable (ce qui est une bonne chose la plupart du temps). Voici une alternative qui peut être exscope dans une seule commande, peut conserver ou ignorer les sauts de ligne, et permet de mélanger les styles de citation selon vos besoins. Fonctionne pour bash et zsh.

 oneLine=$(printf %s \ a \ " b " \ $'\tc\t' \ 'd ' \ ) multiLine=$(printf '%s\n' \ a \ " b " \ $'\tc\t' \ 'd ' \ ) 

J’admets que la nécessité de citer les rend laides pour SQL, mais elle répond à la question (plus généralement exprimée) du titre.

Je l’utilise comme ça

 export LS_COLORS=$(printf %s \ ':*rc=36:*.ini=36:*.inf=36:*.cfg=36:*~=33:*.bak=33:*$=33' \ ... ':bd=40;33;1:cd=40;33;1:or=1;31:mi=31:ex=00') 

dans un fichier provenant à la fois de mes fichiers .bashrc et .zshrc .