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

是的

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

我要打印最后一张 Echo:

a
b
c

注意,我希望变量 P包含换行符?

251118 次浏览

试试 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"

摘要

  1. 在源代码中插入新行

     p="${var1}
    ${var2}"
    echo "${p}"
    
  2. 使用 $'\n'(只有 巴斯Z 弹)

     p="${var1}"$'\n'"${var2}"
    echo "${p}"
    
  3. 使用 echo -e\n转换为新行

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

细节

  1. 在源代码中插入新行

     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"
    
  2. 使用 $'\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"
    
  3. 使用 echo -e\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"
    

    Something 在字符串中插入 "\n"不足以插入新行: "\n"只是两个字符。

所有的输出都是相同的

a
b
c

特别感谢这个答案的贡献者: Kevin戈登 · 戴维森不行Dolda2000三人行


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

var="a
b
c"

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

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

echo "$p"

一般来说,除非您特别需要上面描述的行为,否则应该双引号所有变量插值。

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

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

sed解决方案:

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

结果:

a
b
c

不需要使用 为了循环。

您可以从 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

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

1.1在创世纪。

最基本的是已经使用换行符创建变量。 我们使用已插入换行的代码编写变量值。

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

或者,脚本内部代码:

var="a
b
c"

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

1.2. 使用 shell 引用创建。

序列 $'是 Bash 和 Z shell 中的一个特殊 shell 扩展。

var=$'a\nb\nc'

该行由 shell 解析并展开为“ var = “ anewlinebnewlinec”,这正是我们希望变量 var 成为的样子。这将 没有工作在较旧的 shell 上。

2. 使用 shell 扩展。

它基本上是一个包含多个命令的命令扩展:

  1. Echo-E

     var="$( echo -e "a\nb\nc" )"
    
  2. Bash 和 Z shell < em > printf’% b’

     var="$( printf '%b' "a\nb\nc" )"
    
  3. Bash < em > printf-v

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

     var="$( printf 'a\nb\nc' )"
    

3. 使用 shell 执行。

如果变量包含特殊字符,则可以使用第二个选项中列出的所有命令展开该变量的值。

因此,我们需要做的就是在变量中获取这些值,然后执行一些命令来显示:

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.

注意,如果变量值由攻击者控制,则 打印有些不安全。