如何指定多行 shell 变量?

我写了一个问题:

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

Local sql-一个非常长的字符串。查询没有格式化。 如何将一个字符串拆分为多行?

218200 次浏览

如下所示,使用带有脚本的 read:

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


echo "$sql"

只需在需要的地方插入新行

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

Shell 将寻找结束引号

我想给出一个额外的答案,而在大多数情况下,其他的答案就足够了。

我想要在多行上写一个字符串,但是它的内容必须是单行的。

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

我很抱歉,如果这有点偏离主题(我不需要这个 SQL)。然而,当搜索多行 shell 变量时,这篇文章出现在第一个结果中,另外一个答案似乎是合适的。

由于 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

read不导出变量(这在大多数情况下是一件好事)。这里有一个替代方案,它可以在一个命令中导出,可以保留或丢弃 line feed,并允许根据需要混合引用样式。为 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的文件。