在Bash中如何将字符串拆分为多行?

26 浏览
0 Comments

在Bash中如何将字符串拆分为多行?

如何将长字符串常量分成多行?

我知道可以这样做:

echo "continuation \
lines"
>continuation lines

但是,如果你有缩进的代码,效果就不太好:

    echo "continuation \
    lines"
>continuation     lines

0
0 Comments

在Bash中,如果想要将字符串分割成多行,可以使用换行符(\)来实现。如果在两个字符串之间没有加入空格或其他字符,那么它们会被自动连接在一起。但是,如果在两个字符串之间加入了空格或其他字符,那么它们将被视为两个不同的参数。

如果希望在换行的同时保持代码的缩进,可以使用变量来实现。通过定义多个变量,并在echo命令中使用变量拼接的方式,可以实现在保持缩进的同时将多个字符串连接成一个字符串。

以下是使用单个变量实现的示例代码:

s="string no. 1"
s+="string no. 2"
s+="     string no. 3"
echo "$s"

这样就可以在保持缩进的同时将多个字符串连接成一个字符串,并正确地输出结果。

0
0 Comments

在Bash中,有时我们需要将字符串分成多行来提高可读性。然而,使用传统的换行符并不能达到我们的目标,因为在Bash中,换行符会被视为命令的结束符。

为了解决这个问题,我们可以使用Here Documents的方法来实现在Bash中将字符串分成多行。Here Documents是一种特殊的语法,可以将多行文本作为输入传递给命令。在Bash中,我们可以使用<<-HERE来定义Here Documents的结束符。

举个例子,我们可以这样定义一个Here Documents来实现字符串分行:

cat <<-____HERE
    continuation
    lines
____HERE

这样,我们就可以将字符串分成多行来提高可读性。

如果我们想要保留一些前导空白字符,但不是全部,我们可以使用sed命令或者tr命令来实现。

举个例子,我们可以使用sed命令来保留一些前导空白字符:

sed 's/^  //' <<____HERE
    This has four leading spaces.
    Two of them will be removed by sed.
____HERE

或者我们可以使用tr命令来删除换行符:

tr -d '\012' <<-____
    continuation
     lines
____

对于复杂的长字符串,我们可以使用printf命令来实现字符串分行。

举个例子,我们可以这样使用printf命令:

printf '%s' \
    "This will all be printed on a " \
    "single line (because the format string " \
    "doesn't specify any newline)"

printf命令还适用于在其他语言中嵌入复杂的Shell脚本的情况,如在Makefile或Dockerfile中。

printf '%s\n' >./myscript \
    '#!/bin/sh` \
    "echo \"G'day, World\"" \
    'date +%F\ %T' && \
chmod a+x ./myscript && \
./myscript

以上就是在Bash中如何将字符串分成多行的方法。使用Here Documents和printf命令可以帮助我们实现字符串分行,提高脚本的可读性和维护性。

0
0 Comments

如何在Bash中将字符串拆分为多行?

在Bash中,我们可以使用数组来实现这个目的。首先,我们定义一个数组,每个元素代表一行字符串。然后,使用"${array[*]}"来输出数组中的所有元素,这样就可以将字符串拆分为多行。

具体操作如下:

str_array=("continuation"
             "lines")
echo "${str_array[*]}"

运行结果会输出:

continuation lines

需要注意的是,输出结果中有一个额外的空格。根据Bash文档的解释,如果使用双引号将"${name[*]}"括起来,那么每个数组元素之间会用IFS变量的第一个字符分隔。

为了去除额外的空格,我们可以将IFS变量设置为空:

IFS=''
echo "${str_array[*]}"

这样输出的结果就变成了:

continuationlines

另外,建议使用"${str_array[@]}"来代替"${str_array[*]}"。尽管对于"echo"命令来说没有影响,但对于其他情况可能会有很大的差异。

这个问题的解决方法参考了stackoverflow上的讨论,链接如下:

[a confusion about array versus array in the context of a bash comple](https://stackoverflow.com/questions/3348443)

这就是在Bash中将字符串拆分为多行的方法。通过使用数组和合适的输出格式,我们可以方便地实现这个功能。

0