使用换行符连接多个行变量

时间:2020-04-20 06:09:32

标签: bash concatenation

我有两个变量var1var2,它们可能是多行,也可能是完全空的。例如,任何一个都可能像这样:

line/1
line/2


我想将它们连接起来,以便将var1按原样输出时,将var 2按原样输出到var1的最后一行下面。有4种情况,var1为空,var2不为空,var 2为空,var 1不为空,两者均为空,或都不为空。如果变量之一为空,我不希望有任何空格或空行。因此,如果var 1为空,我不要,


line/1

,反之亦然。

除了使用if,elif,else块以外,还有其他方法可以执行此操作,或者是否必须使用if,else块。

此外,对于最后一个都不为空的情况,如何将这两个连接起来?我尝试过

var3="${var1}\n${var2}" 

但这似乎不起作用。任何提示将不胜感激。

3 个答案:

答案 0 :(得分:2)

使用bash,可以将此功能用于此作业:

concat() {
   printf '%s' "${1:+$1$'\n'}" "${2:+$2$'\n'}";
}

只有在"${1:+$1$'\n'}"为空/未设置的情况下,使用\n会将$1附加到$1

根据man bash

${parameter:+word} 使用备用值。如果参数为null或未设置,则不替换任何内容,否则替换单词的扩展名。

示例:

concat 'line1' 'line2'

line1
line2

concat 'line1' ''

line1

concat '' 'line2'

line2

concat '' ''

concat 'line1
line2
line3' ''

line1
line2
line3

答案 1 :(得分:2)

var3="$var1${var1:+${var2:+$'\n'}}$var2"

应该工作。

$ var1=; var2=; var3="${var1}${var1:+${var2:+$'\n'}}${var2}"; echo "$var3"
               # empty line from echo
$ var1=1; var2=; var3="${var1}${var1:+${var2:+$'\n'}}${var2}"; echo "$var3"
1
$ var1=; var2=2; var3="${var1}${var1:+${var2:+$'\n'}}${var2}"; echo "$var3"
2
$ var1=1; var2=2; var3="${var1}${var1:+${var2:+$'\n'}}${var2}"; echo "$var3"
1
2

  • ${var1}-输入var1
  • ${var1:+-设置var1
    • ${var2:+-设置为var2
      • $'\n'-然后添加换行符
    • }
  • }
  • ${var2}-并添加var2。

基本上,${var1:+${var2:+$'\n'}}仅在同时设置var1var2时才添加换行符,以分隔var1var2

供参考bash manual shell parameter expansion

答案 2 :(得分:1)

您可以尝试使用printf -v

printf -v var3 '%s\n "$var1" "$var2"