我有
var="a b c"
for i in $var
do
p=`echo -e $p'\n'$i`
done
echo $p
我想要打印最后一个回音
a
b
c
请注意,我希望变量p包含换行符。我该怎么做?
答案 0 :(得分:134)
插入\n
p="${var1}\n${var2}"
echo -e "${p}"
在源代码中插入新行
p="${var1}
${var2}"
echo "${p}"
p="${var1}"$'\n'"${var2}"
echo "${p}"
\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"
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"
$'\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
特别感谢此答案的撰稿人:kevinf,Gordon Davisson,l0b0,Dolda2000和tripleee。
修改
for
循环。答案 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)
有三个级别可以在变量中插入换行符 嗯......,技术上只有四个,但前两个只是在代码中编写换行符的两种方法。
最基本的是用换行符创建变量。
我们在代码中写入变量值,并且已插入换行符。
$ var="a
> b
> c"
$ echo "$var"
a
b
c
或者,在脚本代码中:
var="a
b
c"
是的,这意味着在代码中需要写 Enter 。
序列 $ '是bash和zsh中的特殊shell扩展。
var=$'a\nb\nc'
该行由shell解析并扩展为«var =“a 换行符 b 换行符 c”»,这正是我们想要的变量var 。
这将不用于较旧的shell。
它基本上是一个带有几个命令的命令扩展:
echo -e
var="$( echo -e "a\nb\nc" )"
bash和zsh printf'%b'
var="$( printf '%b' "a\nb\nc" )"
bash printf -v
printf -v var '%b' "a\nb\nc"
简单的printf(适用于大多数shell):
var="$( printf 'a\nb\nc' )"
如果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"
当变量替换发生时,解决方案只是在当前迭代期间用“”保护插入的换行符。