尝试在Bash中嵌入变量中的换行符。
在Bash中,如果想要在一个变量中插入换行符,可以使用以下解决方案:
问题出现的原因是,如果不使用双引号将变量的值括起来,在插值时,Shell会根据空格将值拆分成多个部分,将每个换行符处理为一个空格,并且还会扩展通配符。因此,需要使用双引号来确保变量的插值正常。
解决方法是,在插值时使用双引号将变量括起来,如下所示:
echo "$p"
通常情况下,应该在所有的变量插值处使用双引号,除非特别需要上述描述的行为。
关于正确引用的更多内容,请参考[stackoverflow.com/questions/10067266/…](https://stackoverflow.com/questions/10067266)。
如果在macOS Catalina上无法正常工作,即echo打印出来的所有内容都在一行上,这是由于引号的问题,而不是赋值的问题。在插值时,需要使用echo "$p"
,而不是echo $p
。(在zsh
中,甚至不需要引号。并且可能永远都不要使用echo -e
,最好使用printf
来代替基本的echo
。)
在Bash中嵌入换行符的问题是因为在默认情况下,Shell会将换行符解释为参数分隔符,导致输出时换行符被替换为空格。为了保留换行符,需要正确引用变量的使用。
解决方法是使用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"
。
需要注意的是,$'variable'
语法非常方便,但不一定在其他Shell中可移植。
为什么我们需要转义\n?这取决于你指的是哪个转义符。如果指的是最后的echo "$p"
,那是因为Shell会将换行符解释为简单的参数分隔符,将a
、b
和c
作为三个不同的参数传递给echo
,并且echo
会用空格将它们连接起来。当你引用$p
时,它的确切内容将作为一个单一的参数传递。
使用info echo
可以查看所有可能的转义字符,例如var=$'\n'
。感谢建议!
在反引号中使用echo -e
是过于复杂的。如果变量中有一个换行符nl=$'\n'
,你可以直接插入它p=$p$nl$i
,或者更简单地在变量中直接放置一个字面上的换行符。
问题:如何在Bash中将换行符嵌入变量中?
在Bash中,有几种方法可以将换行符嵌入到变量中。以下是三种常见的方法:
1. 在源代码中插入换行符:
var="a b c" for i in $var do p="$p\n$i" # 在源代码中直接插入换行符 done echo "$p" # 需要使用双引号
2. 使用`$'\n'`(仅适用于Bash和Z shell):
var="a b c" for i in $var do p="$p"$'\n'"$i" done echo "$p" # 需要使用双引号
3. 使用`echo -e`将`\n`转换为换行符:
p="${var1}\n${var2}" echo -e "$p"
这些方法可以将换行符嵌入到变量中,并以正确的格式输出。但是需要注意的是,使用`\n`在字符串中仅表示两个字符,并不会真正插入换行符。要输出包含真正换行符的字符串,可以使用`echo -e`命令。
以上是解决Bash中将换行符嵌入变量的问题的常用方法。每种方法都有其适用的场景,选择合适的方法取决于具体的需求。