Обратите внимание, что readв этой ситуации будет код выхода 1; если это имеет значение (например, вы работаете с set -e), вам нужно добавить || trueв конец первой строки.
chepner
4
set -eвыходит из оболочки, если команда имеет "непредвиденный" ненулевой статус выхода. Под «непредвиденным» я подразумеваю, что он работает в контексте, в котором вы специально не смотрите на его статус выхода. falseсам по себе, например, выйдет из оболочки. false || trueне будет, так как вы ожидаете ненулевого статуса выхода, указав другую команду, которая будет запускаться в случае сбоя первой.
не лучшее решение, если запрос sql содержит двойные кавычки. Вам придется сбежать от них, и это станет беспорядком.
dogbane
13
Двойные кавычки @dogbane редко встречаются в большинстве диалектов SQL, так что на практике это чисто.
Iain Samuel McLean Elder
4
Затем заключите строку в одинарные кавычки.
tripleee
Не уверен, зачем вам нужен перенос ведущей строки. Для моего приложения я этого не сделал, поэтому я просто начал сsql="SELECT c2, c2
bhfailor
1
Забавно, что это кажется слишком легким, чтобы быть правдой. К вашему сведению, чтобы добавить DQ, просто создайте переменную DQ = '\ "', а затем укажите ее в инструкции с помощью $ {DQ}.
Тимоти К. Куинн,
69
Я хотел бы дать еще один ответ, а другого в большинстве случаев будет достаточно.
Я хотел написать строку на нескольких строках, но ее содержимое должно было быть однострочным.
sql=" \
SELECT c1, c2 \
from Table1, ${TABLE2} \
where ... \
"
Прошу прощения, если это немного не по теме (мне это не нужно для SQL). Однако этот пост появляется среди первых результатов при поиске многострочных переменных оболочки, и дополнительный ответ казался подходящим.
@MichaelMol - Примерно через два десятилетия после моей первой установки Linux я все еще узнаю что-то новое. Спасибо за эту «выходку».
Сет,
6
Благодаря ответу dimo414 на аналогичный вопрос , это показывает, как работает его отличное решение, и показывает, что вы также можете легко использовать кавычки и переменные в тексте:
пример вывода
$ ./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
readне экспортирует переменную (что в большинстве случаев хорошо). Вот альтернатива, которая может быть экспортирована одной командой, может сохранять или отбрасывать перевод строки и позволяет при необходимости смешивать стили цитирования. Работает на bash и zsh.
oneLine=$(printf %s \
a \
" b " \
$'\tc\t' \
'd ' \
)
multiLine=$(printf '%s\n' \
a \
" b " \
$'\tc\t' \
'd ' \
)
Я признаю, что необходимость цитирования делает это некрасивым для SQL, но он отвечает на (более широко выраженный) вопрос в заголовке.
shell
тут хорошо говорят? Должноbatch
бытьbash
или ты действительно из темной стороны?=
пробелами.Ответы:
Используйте
read
с heredoc, как показано ниже:источник
read
в этой ситуации будет код выхода 1; если это имеет значение (например, вы работаете сset -e
), вам нужно добавить|| true
в конец первой строки.set -e
выходит из оболочки, если команда имеет "непредвиденный" ненулевой статус выхода. Под «непредвиденным» я подразумеваю, что он работает в контексте, в котором вы специально не смотрите на его статус выхода.false
сам по себе, например, выйдет из оболочки.false || true
не будет, так как вы ожидаете ненулевого статуса выхода, указав другую команду, которая будет запускаться в случае сбоя первой.-d ' '
здесь делает?read
не прекращать чтение при обнаружении новой строки.просто вставьте новую строку там, где это необходимо
оболочка будет искать закрывающую кавычку
источник
sql="SELECT c2, c2
Я хотел бы дать еще один ответ, а другого в большинстве случаев будет достаточно.
Я хотел написать строку на нескольких строках, но ее содержимое должно было быть однострочным.
Прошу прощения, если это немного не по теме (мне это не нужно для SQL). Однако этот пост появляется среди первых результатов при поиске многострочных переменных оболочки, и дополнительный ответ казался подходящим.
источник
echo "$sql"
вместоecho $sql
.Благодаря ответу dimo414 на аналогичный вопрос , это показывает, как работает его отличное решение, и показывает, что вы также можете легко использовать кавычки и переменные в тексте:
пример вывода
test.sh
источник
read
не экспортирует переменную (что в большинстве случаев хорошо). Вот альтернатива, которая может быть экспортирована одной командой, может сохранять или отбрасывать перевод строки и позволяет при необходимости смешивать стили цитирования. Работает на bash и zsh.Я признаю, что необходимость цитирования делает это некрасивым для SQL, но он отвечает на (более широко выраженный) вопрос в заголовке.
Я использую это так
в файле, полученном как из моих, так
.bashrc
и из.zshrc
.источник