Napisałem zapytanie:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
local sql - bardzo długi ciąg. Zapytanie nie jest sformatowane. Jak mogę podzielić ciąg na wiele linii?
=
spacjami.
Napisałem zapytanie:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
local sql - bardzo długi ciąg. Zapytanie nie jest sformatowane. Jak mogę podzielić ciąg na wiele linii?
=
spacjami.
Odpowiedzi:
Użyj read
z heredocem, jak pokazano poniżej:
read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF
echo "$sql"
read
w tej sytuacji będzie miał kod zakończenia 1; jeśli to ma znaczenie (na przykład biegasz z set -e
), będziesz chciał dodać || true
na końcu pierwszej linii.
set -e
zamyka powłokę, jeśli polecenie ma „nieoczekiwany” niezerowy kod zakończenia. Przez „nieprzewidziane” rozumiem, że działa w kontekście, w którym nie patrzysz konkretnie na status wyjścia. false
na przykład samo z siebie opuściłoby powłokę. false || true
nie, ponieważ oczekujesz niezerowego kodu wyjścia, określając inną komendę do uruchomienia, jeśli pierwsza zakończy się niepowodzeniem.
-d ' '
tu robi?
read
aby nie przerywać czytania w przypadku napotkania nowej linii.
po prostu wstaw nową linię w razie potrzeby
sql="
SELECT c1, c2
from Table1, Table2
where ...
"
powłoka będzie szukać zamykającego cudzysłowu
sql="SELECT c2, c2
Chciałbym udzielić jednej dodatkowej odpowiedzi, podczas gdy inne w większości przypadków wystarczą.
Chciałem napisać ciąg w wielu wierszach, ale jego zawartość musiała być jednowierszowa.
sql=" \
SELECT c1, c2 \
from Table1, ${TABLE2} \
where ... \
"
Przepraszam, jeśli to trochę nie na temat (nie potrzebowałem tego do SQL). Jednak ten post pojawia się jako jeden z pierwszych wyników wyszukiwania wielowierszowych zmiennych powłoki, a dodatkowa odpowiedź wydawała się odpowiednia.
echo "$sql"
zamiast echo $sql
.
Dzięki odpowiedzi dimo414 na podobne pytanie , pokazuje to, jak działa jego świetne rozwiązanie, i pokazuje, że możesz łatwo mieć cudzysłowy i zmienne w tekście:
$ ./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
nie eksportuje zmiennej (co jest dobre przez większość czasu). Oto alternatywa, którą można wyeksportować za pomocą jednego polecenia, która może zachować lub odrzucić wysunięcia wiersza i umożliwia mieszanie stylów cytowania według potrzeb. Działa dla bash i zsh.
oneLine=$(printf %s \
a \
" b " \
$'\tc\t' \
'd ' \
)
multiLine=$(printf '%s\n' \
a \
" b " \
$'\tc\t' \
'd ' \
)
Przyznaję, że potrzeba cytowania sprawia, że jest to brzydkie dla SQL, ale odpowiada (bardziej ogólnie) na pytanie w tytule.
Używam tego w ten sposób
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')
w pliku pochodzącym zarówno z my, jak .bashrc
i .zshrc
.
shell
tu dobrze gadasz? Powinienbatch
być,bash
czy naprawdę jesteś z ciemnej strony?