试图在bash中的变量中嵌入换行符

时间:2012-02-04 08:03:52

标签: linux bash

我有

var="a b c"
for i in $var
do
   p=`echo -e $p'\n'$i`
done
echo $p

我想要打印最后一个回音

a
b
c

请注意,我希望变量p包含换行符。我该怎么做?

7 个答案:

答案 0 :(得分:134)

摘要

  1. 插入\n

    p="${var1}\n${var2}"
    echo -e "${p}"
    
  2. 在源代码中插入新行

    p="${var1}
    ${var2}"
    echo "${p}"
    
  3. 使用$'\n'(仅限

    p="${var1}"$'\n'"${var2}"
    echo "${p}"
    
  4. 详细

    1。插入\n

    p="${var1}\n${var2}"
    echo -e "${p}"
    

    echo -e将两个字符"\n"解释为新行。

    var="a b c"
    first_loop=true
    for i in $var
    do
       p="$p\n$i"            # Append
       unset first_loop
    done
    echo -e "$p"             # Use -e
    

    避免额外的领先换行

    var="a b c"
    first_loop=1
    for i in $var
    do
       (( $first_loop )) &&  # "((...))" is bash specific
       p="$i"            ||  # First -> Set
       p="$p\n$i"            # After -> Append
       unset first_loop
    done
    echo -e "$p"             # Use -e
    

    使用功能

    embed_newline()
    {
       local p="$1"
       shift
       for i in "$@"
       do
          p="$p\n$i"         # Append
       done
       echo -e "$p"          # Use -e
    }
    
    var="a b c"
    p=$( embed_newline $var )  # Do not use double quotes "$var"
    echo "$p"
    

    2。在源代码中插入新行

    var="a b c"
    for i in $var
    do
       p="$p
    $i"       # New line directly in the source code
    done
    echo "$p" # Double quotes required
              # But -e not required
    

    避免额外的领先换行

    var="a b c"
    first_loop=1
    for i in $var
    do
       (( $first_loop )) &&  # "((...))" is bash specific
       p="$i"            ||  # First -> Set
       p="$p
    $i"                      # After -> Append
       unset first_loop
    done
    echo "$p"                # No need -e
    

    使用功能

    embed_newline()
    {
       local p="$1"
       shift
       for i in "$@"
       do
          p="$p
    $i"                      # Append
       done
       echo "$p"             # No need -e
    }
    
    var="a b c"
    p=$( embed_newline $var )  # Do not use double quotes "$var"
    echo "$p"
    

    3。使用$'\n'(不太便携)

    $'\n'解释为新行。

    var="a b c"
    for i in $var
    do
       p="$p"$'\n'"$i"
    done
    echo "$p" # Double quotes required
              # But -e not required
    

    避免额外的领先换行

    var="a b c"
    first_loop=1
    for i in $var
    do
       (( $first_loop )) &&  # "((...))" is bash specific
       p="$i"            ||  # First -> Set
       p="$p"$'\n'"$i"       # After -> Append
       unset first_loop
    done
    echo "$p"                # No need -e
    

    使用功能

    embed_newline()
    {
       local p="$1"
       shift
       for i in "$@"
       do
          p="$p"$'\n'"$i"    # Append
       done
       echo "$p"             # No need -e
    }
    
    var="a b c"
    p=$( embed_newline $var )  # Do not use double quotes "$var"
    echo "$p"
    

    所有

    的输出相同
    a
    b
    c
    

    特别感谢此答案的撰稿人:kevinfGordon Davissonl0b0Dolda2000tripleee


    修改

答案 1 :(得分:21)

简单的解决方案是将这些换行符放在您想要的位置。

var="a
b
c"

是的,这是一个包含多行的作业。

但是,在插值时需要对该值进行双引号,否则shell会将其分割为空格,从而有效地将每个换行符转换为单个空格(并展开任何通配符)。

echo "$p"

通常,除非您特别需要上述行为,否则您应该双引所有变量插值。

答案 2 :(得分:11)

尝试echo $'a\nb'

如果您想将其存储在一个变量中,然后在完整的换行符中使用它,您必须正确引用您的用法:

var=$'a\nb\nc'
echo "$var"

或者,按字面意思修复您的示例程序:

var="a b c"
for i in $var; do
    p="`echo -e "$p\\n$i"`"
done
echo "$p"

答案 3 :(得分:9)

有三个级别可以在变量中插入换行符 嗯......,技术上只有四个,但前两个只是在代码中编写换行符的两种方法。

1.1。在创作时。

最基本的是用换行符创建变量。
我们在代码中写入变量值,并且已插入换行符。

$ var="a
> b
> c"
$ echo "$var"
a
b
c

或者,在脚本代码中:

var="a
b
c"

是的,这意味着在代码中需要写 Enter

1.2。使用shell引用创建。

序列 $ '是bash和zsh中的特殊shell扩展。

var=$'a\nb\nc'

该行由shell解析并扩展为«var =“a 换行符 b 换行符 c”»,这正是我们想要的变量var 。
这将用于较旧的shell。

2。使用shell扩展。

它基本上是一个带有几个命令的命令扩展:

  1. echo -e

    var="$( echo -e "a\nb\nc" )"
    
  2. bash和zsh printf'%b'

    var="$( printf '%b' "a\nb\nc" )"
    
  3. bash printf -v

    printf -v var '%b' "a\nb\nc"
    
  4. 简单的printf(适用于大多数shell):

    var="$( printf 'a\nb\nc' )"
    
  5. 3。使用shell执行。

    如果var包含特殊字符,则第二个选项中列出的所有命令都可用于扩展var的值。
    因此,我们需要做的就是在var中获取这些值并执行一些命令来显示:

    var="a\nb\nc"                 # var will contain the characters \n not a newline.
    
    echo -e "$var"                # use echo.
    printf "%b" "$var"            # use bash %b in printf.
    printf "$var"                 # use plain printf.
    

    请注意,如果var值由攻击者控制,则printf有些不安全。

答案 4 :(得分:3)

无需使用循环

您可以从bash参数扩展功能中受益:

var="a b c"; 
var=${var// /\\n}; 
echo -e $var
a
b
c

或只使用tr:

var="a b c"
echo $var | tr " " "\n"
a
b
c

答案 5 :(得分:1)

sed解决方案:

echo "a b c" | sed 's/ \+/\n/g'

结果:

a
b
c

答案 6 :(得分:-1)

var="a b c"
for i in $var
do
   p=`echo -e "$p"'\n'$i`
done
echo "$p"

当变量替换发生时,解决方案只是在当前迭代期间用“”保护插入的换行符。