如何在Bash中输出多行字符串
通常,我们将字符串与单行关联。但是有时候,字符串可能超出传统的单BashBash如何处理这些多行字符串。
使用Heredoc创建多行字符串
当我们需要向命令传递多于一行的输入时,通常会使用Heredoc。我们可以自由地给Heredoc任意命名。
语法:
[COMMAND] <<[-] 'DELIMITER'
Line 1
Line 2
…
…
Line N
DELIMITER
示例:
#!/bin/bash
cat << Multi
We have a multiline string.
We have line number two now.
Line 3 follows.
Multi
cat << X
We have a multiline string.
We have line number two now.
Line 3 follows.
X
<<符号作为重定向操作符,用于将heredoc转发到cat命令。任何不会出现在正文中的字符或单词都可以作为分隔符。最后一行中的分隔符表示heredoc的结束。在这里,我们使用了两个不同的分隔符,一个叫做Multi,另一个叫做EOF。cat命令将读取heredoc,直到遇到最后一行的分隔符。然后,它将heredoc的内容写入标准输出。
在一行中创建多行字符串
Bash从未严格限制过。相反,我们总会遇到在Bash中实现同一场景的多种方式。在一行中存储和显示多行字符串也不例外。
使用echo
echo命令非常流行并且广泛使用。其唯一的目的是在终端上显示结果。在我们的情况下,我们想要使用单个echo命令显示多行。以下是我们可以实现这一点的方法。
示例:
text="Line1\nLine2\nLine3\nLineN"
echo -e $text
我们将多行保存在名为text的变量中。我们稍微调整了一下,因为我们想要将这些行保存为单行。我们知道\n表示换行。因此,我们使用换行符将每一行连接成一行。要将此输出显示为多行,即使它们被保存为一行,我们只需要为echo命令提供-e选项。这个选项意味着在同一行上打印。当它开始打印时,它会打印Line1,然后遇到\n符号。它将被迫换行。这个过程将持续到最后一个字符被打印。
使用printf
Printf是另一个实现相同任务的理想命令。它的工作方式与其C编程语言的对应项相同。
示例:
printf "%s\n" "line 1" "line 2" "line N"
printf命令将转换、格式化并将提供的输入写入标准输出。我们提供了%s说明符,因为输出必须是字符串。\n是换行字符的序列。它指示printf开始新行并从那里继续输出。在我们的例子中,它会打印line 1,然后换行,打印line 2,再换行,然后打印line N。
保存多行字符串
我们知道Bash可以将输出重定向到文件或存储在变量中。存储多行并无不同。
文件
示例:
#!/bin/bash
filename=store.txt
cat > $filename << EOF
Line 1
Line 2
Line N
EOF
我们使用heredoc重定向技术来输入多行。cat命令应该在终端上显示输出。然而,由于我们使用了">"符号,我们实际上使cat将内容输出到filename变量。因此,多行字符串将存储在store.txt文件中。
变量
示例:
#!/bin/bash
var1=$(cat << END
This is line one.
This is line two.
This is line three.
END
)
echo "$var1"
read -r -d '' var2<< EOF
Line 1
Line 2
Line N
EOF
echo "$var2"
同样,我们有多种方式可以将多行字符串存储在变量中。我们必须制定一个规则,即每当我们需要多行输入时,我们都需要以某种方式使用heredoc,并进行一些微调以获得所需的结果。在我们的示例中,我们考虑了两种存储输出到变量的方法。在两种情况下,我们都使用了heredoc。在第一种方法中,我们用$()符号包围了整个语句。我们声明了一个变量并将其等于这个值。在第二种情况下,我们也是使用read命令读取,然后将结果存储在var2中,直到读取到EOF。
当打印变量中的值时,我们必须用引号包围变量。如果不这样做,将不会得到换行字符。
最后
- 我们需要heredoc来向命令传递多于一行的输入。
- 使用echo和printf命令,我们可以在单行中创建多行字符串。
- 多行字符串的结果可以存储在文件和变量中。