如何在Bash中输出多行字符串

通常,我们将字符串与单行关联。但是有时候,字符串可能超出传统的单BashBash如何处理这些多行字符串。

file

使用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创建多行字符串

<<符号作为重定向操作符,用于将heredoc转发到cat命令。任何不会出现在正文中的字符或单词都可以作为分隔符。最后一行中的分隔符表示heredoc的结束。在这里,我们使用了两个不同的分隔符,一个叫做Multi,另一个叫做EOF。cat命令将读取heredoc,直到遇到最后一行的分隔符。然后,它将heredoc的内容写入标准输出。

在一行中创建多行字符串

Bash从未严格限制过。相反,我们总会遇到在Bash中实现同一场景的多种方式。在一行中存储和显示多行字符串也不例外。

使用echo

echo命令非常流行并且广泛使用。其唯一的目的是在终端上显示结果。在我们的情况下,我们想要使用单个echo命令显示多行。以下是我们可以实现这一点的方法。

示例:

    text="Line1\nLine2\nLine3\nLineN"
    echo -e $text

使用echo创建多行字符串

我们将多行保存在名为text的变量中。我们稍微调整了一下,因为我们想要将这些行保存为单行。我们知道\n表示换行。因此,我们使用换行符将每一行连接成一行。要将此输出显示为多行,即使它们被保存为一行,我们只需要为echo命令提供-e选项。这个选项意味着在同一行上打印。当它开始打印时,它会打印Line1,然后遇到\n符号。它将被迫换行。这个过程将持续到最后一个字符被打印。

使用printf

Printf是另一个实现相同任务的理想命令。它的工作方式与其C编程语言的对应项相同。

示例:

    printf "%s\n" "line 1" "line 2" "line N"

使用printf创建多行字符串

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命令,我们可以在单行中创建多行字符串。
  • 多行字符串的结果可以存储在文件和变量中。
那些PHP转Go的人混得怎么样了
如何在Shell脚本中添加进度条?

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

30 + 76 =

ajax-loader