This
STR="Hello\nWorld"
echo $STR
作为输出产生
Hello\nWorld
而不是
Hello
World
我应该做什么有一个换行在字符串?
注意:此问题与echo无关。 我知道echo -e,但我正在寻找一种解决方案,允许传递一个字符串(其中包括换行符)作为参数到其他命令,没有类似的选项来解释\n的换行符。
This
STR="Hello\nWorld"
echo $STR
作为输出产生
Hello\nWorld
而不是
Hello
World
我应该做什么有一个换行在字符串?
注意:此问题与echo无关。 我知道echo -e,但我正在寻找一种解决方案,允许传递一个字符串(其中包括换行符)作为参数到其他命令,没有类似的选项来解释\n的换行符。
当前回答
Echo是90年代的,而且充满了危险,使用它应该会导致内核转储不少于4GB。严肃地说,echo的问题是Unix标准化进程最终发明printf实用程序的原因,它解决了所有问题。
要在字符串中获取换行符,有两种方法:
# 1) Literal newline in an assignment.
FOO="hello
world"
# 2) Command substitution.
BAR=$(printf "hello\nworld\n") # Alternative; note: final newline is deleted
printf '<%s>\n' "$FOO"
printf '<%s>\n' "$BAR"
在那里!没有SYSV和BSD的回声疯狂,所有东西都被整齐地打印出来,并完全支持C转义序列。请大家现在就使用printf来满足所有的输出需求,不要回头。
其他回答
唯一简单的替代方法是在变量中输入新行: STR = '新的美元 线的 $STR" %s " 新 行
是的,这意味着在代码中需要的地方输入Enter。
有几个新行字符的等价物。 一种常用的表示新行字符的方法。 新行字符的八进制值。 新行字符的十六进制值。
但所有这些都需要一些工具(POSIX printf)的“解释”:
echo -e "new\nline" ### on POSIX echo, `-e` is not required.
printf 'new\nline' ### Understood by POSIX printf.
printf 'new\012line' ### Valid in POSIX printf.
printf 'new\x0Aline'
printf '%b' 'new\0012line' ### Valid in POSIX printf.
因此,这个工具需要用new-line来构建一个字符串:
$ STR="$(printf 'new\nline')"
$ printf '%s' "$STR"
new
line
在某些shell中,序列$'是一个特殊的shell展开。 已知在ksh93, bash和zsh中工作: STR =美元“新\在线” 当然,也可能有更复杂的解决方案: $ echo '6e65770a6c696e650a' | XXD -p -r 新 行
Or
$ echo "new line" | sed 's/ \+/\n/g'
new
line
这并不理想,但我已经编写了大量代码,并以类似于问题中使用的方法定义了字符串。被接受的解决方案要求我重构大量代码,因此,我将每个\n替换为“$'\n'”,这对我来说很有效。
我对这里的选择都不太满意。这对我来说很管用。
str=$(printf "%s" "first line")
str=$(printf "$str\n%s" "another line")
str=$(printf "$str\n%s" "and another line")
我根据其他答案所做的是
NEWLINE=$'\n'
my_var="__between eggs and bacon__"
echo "spam${NEWLINE}eggs${my_var}bacon${NEWLINE}knight"
# which outputs:
spam
eggs__between eggs and bacon__bacon
knight
问题不在于外壳。问题实际上出在echo命令本身,以及变量插值时缺少双引号。您可以尝试使用echo -e,但并非所有平台都支持它,这也是现在推荐使用printf的原因之一,因为它具有可移植性。
您还可以尝试直接在shell脚本中插入换行符(如果您正在编写脚本),因此它看起来像…
#!/bin/sh
echo "Hello
World"
#EOF
或者同样的
#!/bin/sh
string="Hello
World"
echo "$string" # note double quotes!