148 votes

Comment spécifier une variable shell multi-lignes ?

J'ai écrit une requête :

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

local sql - une très longue chaîne de caractères. La requête n'est pas formatée. Comment puis-je diviser une chaîne en plusieurs lignes ?

203voto

Nik O'Lai Points 3067

Insérez simplement une nouvelle ligne si nécessaire

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

La coquille cherchera le guillemet fermant

171voto

dogbane Points 85749

Utilice read avec un heredoc comme indiqué ci-dessous :

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

echo "$sql"

89voto

islijepcevic Points 978

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

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

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

Je suis désolé si cette question est un peu hors sujet (je n'en avais pas besoin pour SQL). Cependant, ce post apparaît parmi les premiers résultats lors d'une recherche de variables shell multi-lignes et une réponse supplémentaire semblait appropriée.

7voto

Brad Parks Points 5513

Merci à La réponse de dimo414 à une question similaire Ceci montre comment son excellente solution fonctionne, et montre que vous pouvez également avoir des guillemets 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 <<EOF

  $1 Would you "like" to know how many 'files' there are in /tmp?

  There are "$COUNT" files in /tmp, according to the "wc" command

EOF
}

function main()
{
  OUT=$(text1 "Welcome dev:")
  echo "The text from the example function is: $OUT"
}

main

6voto

EndlosSchleife Points 359

read n'exporte pas la variable (ce qui est une bonne chose la plupart du temps). Voici une alternative qui peut être exportée en une seule commande, qui peut préserver ou supprimer les sauts de ligne, et qui permet de mélanger les styles de citation selon les 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 le besoin de citation rend la chose désagréable pour SQL, mais cela répond à la question (plus généralement exprimée) du titre.

Je l'utilise comme ceci

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 mon .bashrc y .zshrc .

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