Zauważ, że readw 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ć || truena końcu pierwszej linii.
chepner
4
set -ezamyka 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. falsena przykład samo z siebie opuściłoby powłokę. false || truenie, ponieważ oczekujesz niezerowego kodu wyjścia, określając inną komendę do uruchomienia, jeśli pierwsza zakończy się niepowodzeniem.
niezbyt dobre rozwiązanie, jeśli zapytanie sql zawiera cudzysłowy. Będziesz musiał przed nimi uciec i zrobi się bałagan.
zgubienie psów
13
Podwójne cudzysłowy @dogbane pojawiają się rzadko w większości dialektów SQL, więc w praktyce jest to czyste.
Iain Samuel McLean Elder
4
Następnie zawiń ciąg w pojedyncze cudzysłowy.
tripleee
Nie jestem pewien, dlaczego chcesz lub potrzebujesz przełamania linii wiodącej. W mojej aplikacji nie zrobiłem, więc właśnie zacząłemsql="SELECT c2, c2
bhfailor
1
Zabawne, że wydaje się to zbyt łatwe, aby mogło być prawdziwe. FYI, aby dodać DQ, po prostu utwórz zmienną DQ = '\ "', a następnie odwołaj się do niej w instrukcji za pomocą $ {DQ}.
Timothy C. Quinn
69
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.
Nawet bez tego moja treść wychodzi w jednej linii.
papiro
12
@papiro, spróbuj echo "$sql"zamiast echo $sql.
Michael Mol
@MichaelMol - Około dwie dekady po mojej pierwszej instalacji Linuksa i wciąż uczę się czegoś nowego. Dzięki za tę "sztuczkę".
Seth
6
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:
przykładowe dane wyjściowe
$ ./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/bashfunction 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
readnie 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.
shell
tu dobrze gadasz? Powinienbatch
być,bash
czy naprawdę jesteś z ciemnej strony?=
spacjami.Odpowiedzi:
Użyj
read
z heredocem, jak pokazano poniżej:źródło
read
w tej sytuacji będzie miał kod zakończenia 1; jeśli to ma znaczenie (na przykład biegasz zset -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
powłoka będzie szukać zamykającego cudzysłowu
źródło
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.
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.
źródło
echo "$sql"
zamiastecho $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:
przykładowe dane wyjściowe
test.sh
źródło
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.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
w pliku pochodzącym zarówno z my, jak
.bashrc
i.zshrc
.źródło