如何指定一个多行shellvariables?

我写了一个查询:

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

本地sql – 一个很长的string。 查询未格式化。 我怎样才能把一个string分成多行?

使用read与heredoc如下所示:

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

只需在必要时插入新的行

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

shell将寻找收盘引号

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

我想写一个string在多行,但其内容需要是单行的。

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

我很抱歉,如果这有点偏离主题(我不需要这个SQL)。 然而,当search多行shellvariables时,这个post出现在第一个结果中,而另一个答案似乎是合适的。

感谢dimo414对类似问题的回答 ,这显示了他伟大的解决scheme是如何工作的,并且表明您可以轻松地在文本中引用引号和variables:

示例输出

 $ ./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不会导出variables(这在大多数情况下是好事)。 这是一个可以在一个命令中导出的替代scheme,可以保留或丢弃换行符,并允许根据需要混合引用样式。 适用于bash和zsh。

 oneLine=$(printf %s \ a \ " b " \ $'\tc\t' \ 'd ' \ ) multiLine=$(printf '%s\n' \ a \ " b " \ $'\tc\t' \ 'd ' \ ) 

我承认引用的必要性使得这个SQL很丑陋,但它回答了标题中的(更普遍expression的)问题。

我这样使用它

 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