如何将多行值赋给bash变量

15

我手头有一个变量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的答案对我来说不合适,因为我正在进行密集的字符串操作,代码格式也很重要。

2
删除第2行和第3行的前导空格,并使用:echo "$FOO" - Cyrus
3个回答

35

不要缩进代码行,否则会出现额外的空格。在展开"$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

嗨 John,你的示例代码对我有效!不过,在上面的第一个示例中,当我在没有将$FOO放在引号之间的情况下使用echo $FOO输出时,结果会显示在同一行。你知道为什么吗?我正在Ubuntu 14.04上使用GNU bash,版本为4.3.11(1)-release。 - yaobin
当您没有引号时,就会发生这种情况。该值受到单词拆分全局扩展的影响。与告诉echo打印一个带有嵌入式换行符的参数不同,$FOO的每个单词都成为一个单独的参数,没有换行符。就好像您编写了echo This is line 1 This is line 2 This is line 3。底线:除非您确实希望其受到单词拆分和全局扩展(很少见)的影响,否则请始终引用变量扩展。 - John Kugelman

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

它的输出为“-e 这是第1行 这是第2行 这是第3行” - Juned
2
@juned 你需要一个支持 -eecho 版本。Bash 内置的 echo 命令支持,GNU 的 /bin/echo 二进制文件也支持。 - John Kugelman
这个脚本在我用 ./script.sh 运行时是可以工作的,但是用 sh scripname 就不行了。 - Juned
1
不要使用 sh script.sh 运行脚本。这会覆盖脚本想要的解释器,而是使用普通的 sh。输入 ./script.sh 确保使用正确的解释器。 - John Kugelman
1
希望你不介意我将你的评论添加到我的答案中@mklement0,随意编辑以符合你的喜好。 - Jonny Henly

0

你也可以使用readlines将这些行存储到一个变量中:

$ 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接