He escrito una consulta:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
sql local: una cadena muy larga. La consulta no tiene formato. ¿Cómo puedo dividir una cadena en varias líneas?
=
con espacios.
He escrito una consulta:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
sql local: una cadena muy larga. La consulta no tiene formato. ¿Cómo puedo dividir una cadena en varias líneas?
=
con espacios.
Respuestas:
Úselo read
con un heredoc como se muestra a continuación:
read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF
echo "$sql"
read
tendrá un código de salida de 1 en esta situación; si eso importa (está ejecutando con set -e
, por ejemplo), querrá agregar un || true
al final de la primera línea.
set -e
sale del shell si un comando tiene un estado de salida "no anticipado" distinto de cero. Por "no anticipado", me refiero a que se ejecuta en un contexto en el que no se está mirando específicamente su estado de salida. false
por sí mismo, por ejemplo, saldría del shell. false || true
no lo haría, ya que está anticipando el estado de salida distinto de cero al especificar otro comando para ejecutar si el primero falla.
-d ' '
aqui
read
no deje de leer cuando se encuentre con una nueva línea.
simplemente inserte una nueva línea donde sea necesario
sql="
SELECT c1, c2
from Table1, Table2
where ...
"
shell buscará las comillas de cierre
sql="SELECT c2, c2
Me gustaría dar una respuesta adicional, mientras que las otras serán suficientes en la mayoría de los casos.
Quería escribir una cadena en varias líneas, pero su contenido tenía que ser de una sola línea.
sql=" \
SELECT c1, c2 \
from Table1, ${TABLE2} \
where ... \
"
Lo siento si esto es un poco fuera de tema (no lo necesitaba para SQL). Sin embargo, esta publicación aparece entre los primeros resultados al buscar variables de shell de múltiples líneas y una respuesta adicional parecía apropiada.
echo "$sql"
lugar de echo $sql
.
Gracias a la respuesta de dimo414 a una pregunta similar , esto muestra cómo funciona su gran solución y muestra que también puede tener citas y variables en el texto fácilmente:
$ ./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
no exporta la variable (lo cual es bueno la mayor parte del tiempo). Aquí hay una alternativa que se puede exportar en un comando, puede preservar o descartar los avances de línea y permite mezclar estilos de comillas según sea necesario. Funciona para bash y zsh.
oneLine=$(printf %s \
a \
" b " \
$'\tc\t' \
'd ' \
)
multiLine=$(printf '%s\n' \
a \
" b " \
$'\tc\t' \
'd ' \
)
Admito que la necesidad de citar hace que esto sea desagradable para SQL, pero responde a la pregunta (expresada de manera más general) en el título.
Lo uso así
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')
en un archivo procedente de mi .bashrc
y .zshrc
.
shell
estás hablando bien aquí? ¿Deberíasbatch
serbash
o eres realmente del lado oscuro?