当我做
str="Hello World\n===========\n"
我也把它\n
打印出来。那我怎么换行?
当我做
str="Hello World\n===========\n"
我也把它\n
打印出来。那我怎么换行?
Answers:
在bash
你可以使用语法
str=$'Hello World\n===========\n'
单引号前加a $
是一种新语法,该语法允许在字符串中插入转义序列。
还printf
内置允许将结果输出保存到变量
printf -v str 'Hello World\n===========\n'
两种解决方案都不需要子外壳。
如果在下面需要打印字符串,则应使用双引号,如以下示例所示:
echo "$str"
因为当您打印不带引号的字符串时,换行符会转换为空格。
str=$'Hello World\n===========\n'
叫什么?变量替换?
str=$"My $PET eats:\n$PET food"
?这种方法适用于双引号
您可以将文字换行符放在单引号中(在任何Bourne / POSIX样式的shell中)。
str='Hello World
===========
'
对于多行字符串,此处的文档通常很方便。该字符串将作为命令的输入。
mycommand <<'EOF'
Hello World
===========
EOF
如果要将字符串存储在变量中,请cat
在命令替换中使用该命令。字符串末尾的换行符将通过命令替换除去。如果要保留最后的换行符,请在末尾放置一个塞子,然后将其剥离。在POSIX兼容的外壳程序中,可以编写str=$(cat <<'EOF'); str=${str%a}
适当的Heredoc,但是bash要求Heredoc出现在右括号之前。
str=$(cat <<'EOF'
Hello World
===========
a
EOF
); str=${str%a}
在ksh,bash和zsh中,可以使用$'…'
引号形式在引号内扩展反斜杠转义符。
str=$'Hello World\n===========\n'
str=$(cat <<'EOF')
不能按原样工作.. )
需要放在文档末尾的下一行EOF
..即便如此,由于Command,它丢失了尾随的换行符替代。
\n
在bash
捕获变量中的here-doc时保留尾随(和前导)实例,请考虑IFS= read -r -d '' str <<'EOF'...
使用另一种停止方法(请参阅我的答案)。
您是否在使用“ echo”?尝试“ echo -e”。
echo -e "Hello World\n===========\n"
echo
除非指定-n,否则它将自动添加一个。(但是,主要的问题是如何使这些换行符成为变量)。
bash
,echo -e
它确实可以在OS X上使用-这是因为echo
它是内置的bash (而不是外部可执行文件),并且该内置也支持-e
。(作为一个内置的,它应该在工作全部是bash的运行在平台上;顺便说一句,echo -e
工程ksh
和zsh
太)。相比之下,然而,外部echo
效用 在OS X - /bin/echo
-事实上也没有支持-e
。
为了补充现有的出色答案:
如果您正在使用bash
并且更喜欢使用实际的换行符来提高可读性,read
则是在变量中捕获此处文档的另一种选择,该变量(与此处的其他解决方案一样)不需要使用子shell。
# Reads a here-doc, trimming leading and trailing whitespace.
# Use `IFS= read ...` to preserve it (the trailing \n, here).
read -r -d '' str <<'EOF' # Use `IFS= read ...` to preserve the trailing \n
Hello World
===========
EOF
# Test: output the variable enclosed in "[...]", to show the value's boundaries.
$ echo "$str"
[Hello World
===========]
-r
确保read
不解释输入(默认情况下,它将对反斜杠进行特殊处理,但这很少需要)。
-d ''
将“记录”定界符设置为空字符串,从而一次read
读取整个输入(而不是单行)。
请注意,通过将$IFS
(内部字段分隔符)保留为默认值$' \t\n'
(空格,制表符,换行符),会从分配给的值($str
包括here-doc的尾随换行符)中修剪任何前导和尾随空格。
(请注意,即使here-doc的正文从开始定界符(此处)之后的行开始'EOF'
,也不会包含前导换行符)。
通常,这是所需的行为,但是如果您确实希望该结尾的换行符,请使用IFS= read -r -d ''
而不是just read -r -d ''
,但是请注意,然后会保留所有开头和结尾的空格。
(请注意,IFS=
直接在该read
命令之前表示该赋值仅在该命令期间有效,因此无需还原先前的值。)
使用here-doc还可以让您选择使用缩进来设置多行字符串以提高可读性:
# Caveat: indentation must be actual *tab* characters - spaces won't work.
read -r -d '' str <<-'EOF' # NOTE: Only works if the indentation uses actual tab (\t) chars.
Hello World
===========
EOF
# Output the variable enclosed in "[...]", to show the value's boundaries.
# Note how the leading tabs were stripped.
$ echo "$str"
[Hello World
===========]
配售-
之间<<
,在这里,DOC的开始分隔符('EOF'
在这里)使导致制表符从这里-doc的身体,甚至关闭定界符被剥离,但千万注意,这仅与工作实际的制表符,没有空格,所以如果你的编辑器将选项卡的按键转换为空格,需要额外的工作。
您需要这样做:
STR=$(echo -ne "Hello World\n===========\n")
更新:
正如Fred所指出的那样,这样您将失去尾随的“ \ n”。要分配反斜杠序列扩展的变量,请执行以下操作:
STR=$'Hello World\n===========\n\n'
让我们测试一下:
echo "[[$STR]]"
现在给我们:
[[Hello World
===========
]]
请注意,$''与$“”不同。第二个根据当前语言环境进行翻译。有关详细信息,请参见中的“引用”部分man bash
。
#!/bin/bash
result=""
foo="FOO"
bar="BAR"
result+=$(printf '%s' "$foo")$'\n'
result+=$(printf '%s' "$bar")$'\n'
echo "$result"
printf '%s' "$result"
输出:
FOO
BAR
FOO
BAR
result+=$foo$'\n'
?如果有的话,$(printf %s "$foo")
将修剪尾随的换行符$foo
。