Как указать многострочную переменную оболочки?

Я написал запрос:

function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}

local sql - очень длинная строка. Запрос не отформатирован. Как я могу разбить строку на несколько строк?

Ответ 1

Используйте read с помощью heredoc, как показано ниже:

read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF

echo "$sql"

Ответ 2

просто вставьте новую строку, если необходимо

sql="
SELECT c1, c2
from Table1, Table2
where ...
"

оболочка будет искать закрывающий кавычек

Ответ 3

Я хотел бы дать еще один ответ, в то время как другие будут достаточными в большинстве случаев.

Я хотел написать строку по нескольким строкам, но ее содержимое должно быть однострочным.

sql="                       \
SELECT c1, c2               \
from Table1, ${TABLE2}      \
where ...                   \
"

Прошу прощения, если это немного не по теме (мне это не нужно для SQL). Однако это сообщение появляется среди первых результатов при поиске многострочных переменных оболочки, и дополнительный ответ представляется подходящим.

Ответ 4

Благодаря 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/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

Ответ 5

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.