Я написал запрос:
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
в конец первой строки.
set -e
выходит из оболочки, если команда имеет "непредвиденный" ненулевой статус выхода. Под «непредвиденным» я подразумеваю, что он работает в контексте, в котором вы специально не смотрите на его статус выхода. false
сам по себе, например, выйдет из оболочки. false || true
не будет, так как вы ожидаете ненулевого статуса выхода, указав другую команду, которая будет запускаться в случае сбоя первой.
-d ' '
здесь делает?
read
не прекращать чтение при обнаружении новой строки.
просто вставьте новую строку там, где это необходимо
sql="
SELECT c1, c2
from Table1, Table2
where ...
"
оболочка будет искать закрывающую кавычку
sql="SELECT c2, c2
Я хотел бы дать еще один ответ, а другого в большинстве случаев будет достаточно.
Я хотел написать строку на нескольких строках, но ее содержимое должно было быть однострочным.
sql=" \
SELECT c1, c2 \
from Table1, ${TABLE2} \
where ... \
"
Прошу прощения, если это немного не по теме (мне это не нужно для SQL). Однако этот пост появляется среди первых результатов при поиске многострочных переменных оболочки, и дополнительный ответ казался подходящим.
echo "$sql"
вместо echo $sql
.
Благодаря ответу 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
или ты действительно из темной стороны?