如何为bash变量指定多行值

时间:2016-06-29 04:50:33

标签: bash shell

我有一个变量FOO,需要为我分配一个多行的值。像这样的东西,

FOO="This is line 1
     This is line 2
     This is line 3"

因此,当我打印FOO的值时,它应该提供以下输出。

echo $FOO
output:
This is line 1
This is line 2
This is line 3

此外,行数将动态决定,因为我将使用循环初始化它。

主要使用read -d的其他问题中显示的答案不适合我,因为我正在进行密集的字符串操作,而且代码格式也很重要。

3 个答案:

答案 0 :(得分:26)

不要缩进线条,否则你会获得额外的空间。展开"$FOO"时使用引号以确保保留换行符。

$ FOO="This is line 1 
This is line 2   
This is line 3"
$ echo "$FOO"
This is line 1
This is line 2
This is line 3

另一种方法是使用\n转义序列。它们在$'...'字符串中解释。

$ FOO=$'This is line 1\nThis is line 2\nThis is line 3'
$ echo "$FOO"

第三种方法是存储字符\n,然后让echo -e解释转义序列。这是一个微妙的差异。重要的是\n不在常规引号内解释。

$ FOO='This is line 1\nThis is line 2\nThis is line 3'
$ echo -e "$FOO"
This is line 1
This is line 2
This is line 3

如果删除-e选项并让echo打印原始字符串而不解释任何内容,您可以看到我正在做出的区别。

$ echo "$FOO"
This is line 1\nThis is line 2\nThis is line 3

答案 1 :(得分:4)

初始化FOO时,您应该使用换行符:\n

FOO="This is line 1\nThis is line 2\nThis is line 3"

然后使用echo -e输出FOO

  

请务必注意\n内的"..."不是换行符,而是文字\,后跟文字n。只有在echo -e 解释时,才会将此文字序列转换为换行符。 - 来自mklement0

的明智话语
#!/bin/bash

FOO="This is line 1\nThis is line 2\nThis is line 3"
echo -e $FOO

Output:
This is line 1
This is line 2
This is line 3

答案 2 :(得分:0)

您还可以使用读取的行将行存储到变量中:

$ read -r -d '' FOO << EOF
This is line 1
This is line 2
This is line 3
EOF

要查看打印换行符,请在变量周围使用引号:({echo "$FOO"而不是echo $FOO

$ echo "$FOO"
This is line 1
This is line 2
This is line 3