Я написал запрос:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
local sql - очень длинная строка. Запрос не отформатирован. Как разбить строку на несколько строк?
Я написал запрос:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
local sql - очень длинная строка. Запрос не отформатирован. Как разбить строку на несколько строк?
Используйте read
с heredoc, как показано ниже:
read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF
echo "$sql"
read
будет иметь код выхода 1; если это важно (например, вы работаете с set -e
), вам нужно добавить || true
в конце первой строки.
- person chepner; 15.03.2013
set -e
на это влияет? просто любопытно.
- person chakrit; 22.09.2015
set -e
выходит из оболочки, если команда имеет непредвиденный ненулевой статус выхода. Под непредвиденным я имею в виду, что он работает в контексте, в котором вы специально не смотрите на его статус выхода. false
сам по себе, например, выйдет из оболочки. false || true
не будет, так как вы ожидаете ненулевого статуса выхода, указав другую команду, которая будет выполняться в случае сбоя первой.
- person chepner; 22.09.2015
-d ' '
?
- person hg_git; 26.09.2016
read -d
кажется банальным, есть ли способ сделать это в стандартной оболочке?
- person wilx; 10.10.2016
read
не прекращать чтение при обнаружении новой строки.
- person Cyker; 04.12.2016
просто вставьте новую строку там, где это необходимо
sql="
SELECT c1, c2
from Table1, Table2
where ...
"
оболочка будет искать закрывающую кавычку
sql="SELECT c2, c2
- person bhfailor; 30.01.2018
Я хотел бы дать еще один ответ, а других в большинстве случаев будет достаточно.
Я хотел написать строку на нескольких строках, но ее содержимое должно было быть однострочным.
sql=" \
SELECT c1, c2 \
from Table1, ${TABLE2} \
where ... \
"
Прошу прощения, если это немного не по теме (мне это не нужно для SQL). Однако этот пост появляется среди первых результатов при поиске многострочных переменных оболочки, и дополнительный ответ казался подходящим.
echo "$sql"
вместо echo $sql
.
- person Michael Mol; 03.05.2017
Благодаря ответу 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
#!/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
не экспортирует переменную (что в большинстве случаев хорошо). Вот альтернатива, которая может быть экспортирована одной командой, может сохранять или отбрасывать перевод строки и позволяет при необходимости смешивать стили цитирования. Работает на bash и zsh.
oneLine=$(printf %s \
a \
" b " \
$'\tc\t' \
'd ' \
)
multiLine=$(printf '%s\n' \
a \
" b " \
$'\tc\t' \
'd ' \
)
Я признаю, что необходимость цитирования делает это некрасивым для SQL, но он отвечает на (более широко выраженный) вопрос в заголовке.
Я использую это так
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')
в файле, полученном из моих .bashrc
и .zshrc
.
shell
здесь хорошо говорят? Должноbatch
бытьbash
или вы действительно из темной стороны? - person Chris Seymour   schedule 15.03.2013=
пробелами. - person Nik O'Lai   schedule 15.03.2013