J'ai écrit une requête:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
local sql - une très longue chaîne. La requête n'est pas formatée. Comment puis-je diviser une chaîne en plusieurs lignes?
=
d'espaces.
J'ai écrit une requête:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
local sql - une très longue chaîne. La requête n'est pas formatée. Comment puis-je diviser une chaîne en plusieurs lignes?
=
d'espaces.
Réponses:
Utiliser read
avec un heredoc comme indiqué ci-dessous:
read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF
echo "$sql"
read
aura un code de sortie de 1 dans cette situation; si cela compte (vous exécutez avec set -e
, par exemple), vous voudrez ajouter un || true
à la fin de la première ligne.
set -e
quitte le shell si une commande a un statut de sortie "imprévu" différent de zéro. Par "imprévu", je veux dire qu'il s'exécute dans un contexte où vous ne regardez pas spécifiquement son état de sortie. false
par lui-même, par exemple, quitterait le shell. false || true
ne le ferait pas, puisque vous anticipez l'état de sortie différent de zéro en spécifiant une autre commande à exécuter si la première échoue.
-d ' '
ici?
read
ne pas arrêter la lecture lorsque vous rencontrez une nouvelle ligne.
insérez simplement une nouvelle ligne si nécessaire
sql="
SELECT c1, c2
from Table1, Table2
where ...
"
shell recherchera le guillemet fermant
sql="SELECT c2, c2
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 sur une seule ligne.
sql=" \
SELECT c1, c2 \
from Table1, ${TABLE2} \
where ... \
"
Je suis désolé si cela était un peu hors sujet (je n'en avais pas besoin pour SQL). Cependant, cet article fait partie des premiers résultats lors de la recherche de variables shell multilignes et une réponse supplémentaire a semblé appropriée.
echo "$sql"
au lieu de echo $sql
.
Merci à la réponse de dimo414 à une question similaire , cela montre comment fonctionne sa grande solution et montre que vous pouvez également avoir des guillemets et des variables dans le texte:
$ ./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
#!/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
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, peut conserver ou ignorer les sauts de ligne et permet de mélanger les styles de guillemets 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 citations rend cela moche pour SQL, mais cela répond à la question (plus généralement exprimée) dans le 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 mon .bashrc
et de.zshrc
.
shell
parle bien ici? Devriez-vousbatch
êtrebash
ou êtes-vous vraiment du côté obscur?