Bash延续线

143 bash indentation line

你如何使用bash延续线?

我意识到你可以这样做:

echo "continuation \
lines"
>continuation lines
Run Code Online (Sandbox Code Playgroud)

但是,如果你有缩进代码,它不能很好地工作:

    echo "continuation \
    lines"
>continuation     lines
Run Code Online (Sandbox Code Playgroud)

Ray*_*oal 149

这是你可能想要的

$       echo "continuation"\
>       "lines"
continuation lines
Run Code Online (Sandbox Code Playgroud)

如果这创建了两个echo参数而你只想要一个,那么让我们看看字符串连接.在bash中,将两个字符串放在彼此旁边连接:

$ echo "continuation""lines"
continuationlines
Run Code Online (Sandbox Code Playgroud)

所以没有缩进的延续行是分解字符串的一种方法:

$ echo "continuation"\
> "lines"
continuationlines
Run Code Online (Sandbox Code Playgroud)

但是当使用缩进时:

$       echo "continuation"\
>       "lines"
continuation lines
Run Code Online (Sandbox Code Playgroud)

你得到两个参数,因为它不再是连接.

如果你想要一个跨越行的单个字符串,在缩进但没有获得所有这些空格的情况下,你可以尝试的一种方法是抛弃延续行并使用变量:

$ a="continuation"
$ b="lines"
$ echo $a$b
continuationlines
Run Code Online (Sandbox Code Playgroud)

这将允许您以额外的变量为代价来使用干净的缩进代码.如果你把变量设为局部变量,那应该不会太糟糕.

  • 解决方案有一个变量:`s ="string no.1"s + ="string no.2"s + ="string no.3"echo"$ s"` (3认同)

tri*_*eee 27

这里带有<<-HERE终结符的文档适用于缩进的多行文本字符串.它将从此处的文档中删除任何前导选项卡.(但终止线仍将保留.)

cat <<-____HERE
    continuation
    lines
____HERE
Run Code Online (Sandbox Code Playgroud)

另见http://ss64.com/bash/syntax-here.html

如果你需要保留一些(但不是全部)领先的空格,你可能会使用类似的东西

sed 's/^  //' <<____HERE
    This has four leading spaces.
    Two of them will be removed by sed.
____HERE
Run Code Online (Sandbox Code Playgroud)

为了在很多行上包装长复杂的字符串,我喜欢tr:

tr -d '\012' <<-____
    continuation
     lines
____
Run Code Online (Sandbox Code Playgroud)


Cyb*_*aut 11

在某些情况下,利用 Bash 的串联能力可能是合适的。

例子:

temp='this string is very long '
temp+='so I will separate it onto multiple lines'
echo $temp
this string is very long so I will separate it onto multiple lines
Run Code Online (Sandbox Code Playgroud)

从 Bash Man 页面的 PARAMETERS 部分:

名称=[值]...

...在赋值语句将值赋给 shell 变量或数组索引的上下文中,+= 运算符可用于追加或添加到变量的先前值。当 += 应用于已设置整数属性的变量时, value 将作为算术表达式进行计算,并添加到变量的当前值上,该值也会被计算。当使用复合赋值将 += 应用于数组变量时(请参阅下面的数组),该变量的值不会取消设置(与使用 = 时一样),并且新值会从比数组最大索引大 1 的位置开始附加到数组中(对于索引数组)或作为附加键值对添加到关联数组中。 当应用于字符串值变量时,值会扩展并附加到变量的值中。


two*_*rec 8

您可以使用bash数组

$ str_array=("continuation"
             "lines")
Run Code Online (Sandbox Code Playgroud)

然后

$ echo "${str_array[*]}"
continuation lines
Run Code Online (Sandbox Code Playgroud)

还有一个额外的空间,因为(在bash手册之后):

如果单词是双引号,则${name[*]}扩展为单个单词,每个数组成员的值由IFS变量的第一个字符分隔

所以设置IFS=''摆脱额外的空间

$ IFS=''
$ echo "${str_array[*]}"
continuationlines
Run Code Online (Sandbox Code Playgroud)