Eu escrevi uma consulta:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
sql local - uma string muito longa. A consulta não está formatada. Como posso dividir uma string em várias linhas?
=
espaços.
Eu escrevi uma consulta:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
sql local - uma string muito longa. A consulta não está formatada. Como posso dividir uma string em várias linhas?
=
espaços.
Respostas:
Usar read
com um heredoc, como mostrado abaixo:
read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF
echo "$sql"
read
terá um código de saída 1 nessa situação; se isso importa (você está executando set -e
, por exemplo), adicione um || true
no final da primeira linha.
set -e
sai do shell se um comando tiver um status de saída diferente de zero "não antecipado". Por "imprevisto", quero dizer que é executado em um contexto em que você não está olhando especificamente para o status de saída. false
por si só, por exemplo, sairia do shell. false || true
não, pois você está antecipando o status de saída diferente de zero, especificando outro comando para executar se o primeiro falhar.
-d ' '
faz aqui?
read
para não parar de ler ao encontrar uma nova linha.
basta inserir uma nova linha sempre que necessário
sql="
SELECT c1, c2
from Table1, Table2
where ...
"
shell estará procurando as aspas finais
sql="SELECT c2, c2
Eu gostaria de dar uma resposta adicional, enquanto as outras serão suficientes na maioria dos casos.
Eu queria escrever uma string em várias linhas, mas seu conteúdo precisava ser de linha única.
sql=" \
SELECT c1, c2 \
from Table1, ${TABLE2} \
where ... \
"
Sinto muito se isso estiver um pouco fora do tópico (eu não precisava disso para SQL). No entanto, este post aparece entre os primeiros resultados ao pesquisar variáveis de shell de várias linhas e uma resposta adicional parecia apropriada.
echo "$sql"
vez de echo $sql
.
Graças à resposta de dimo414 a uma pergunta semelhante , isso mostra como sua ótima solução funciona e mostra que você também pode ter aspas e variáveis no texto:
$ ./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ão exporta a variável (o que é bom na maioria das vezes). Aqui está uma alternativa que pode ser exportada em um comando, pode preservar ou descartar alimentações de linha e permite misturar estilos de aspas, conforme necessário. Funciona para o bash e o zsh.
oneLine=$(printf %s \
a \
" b " \
$'\tc\t' \
'd ' \
)
multiLine=$(printf '%s\n' \
a \
" b " \
$'\tc\t' \
'd ' \
)
Admito que a necessidade de citar torna isso feio para o SQL, mas responde à pergunta (mais geralmente expressa) no título.
Eu uso assim
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')
em um arquivo originado tanto do meu .bashrc
como do .zshrc
.
shell
estão falando bem aqui? Deveriabatch
serbash
ou você é realmente do lado sombrio?