我在bash中打印有多行字符串时遇到麻烦。当我运行这个脚本时,所有内容都打印在一行
#!/bin/bash
content=""
for ((i = 0 ; i <= 10 ; i++)); do
content=$'n'"${content}""${i}"
done
echo "${content}"
但是如果我把它改成这样,那么所有的东西都打印在多行上:
#!/bin/bash
content=""
for ((i = 0 ; i <= 10 ; i++)); do
content="${content}""${i}"$'n'
done
echo "${content}"
为什么把$'n'
放在末尾,而不是放在开头?
bash中的变量就像缓冲区一样,n
在变量之前将首先连接转义字符,只有在转义字符之后才会连接字符串。首先,您提到的echo将首先输出n
(特殊字符),然后才输出连接本身。因为你告诉bash的是"将所有特殊字符放入缓冲区,连接字符串然后将缓冲区和字符串打印在一起">.
在我下面写的第一个例子中,您可以以您期望的方式连接缓冲区中甚至像n
这样的特殊字符。把n
放在最后会告诉echo解释器,我们的文本中有一些特殊的字符存储在某个变量中。由于-e
选项,它可以以这种方式进行解释,并且只有在这种情况下,变量才被视为bash中的变量。否则,它就像我之前说的那样,像一个缓冲区。
你的content
变量函数就像一个缓冲区,它应该正确地打印出来。在您的情况下,您需要在每行之前添加新行。因此,您所要做的就是在打印缓冲区时启用echo命令来解释新行。因此,您可以使用echo -e
选项,当您在行尾与n
进行字符串连接时,可以进一步使用echo -ne
选项。
如果你想缓冲这样的输出,你可以使用如下代码:
content=$(
clear
for ((i = 0 ; i <= 10 ; i++)); do
echo "n${i}"
done
)
echo -ne "${content}"
毕竟,脚本应该这样使用字符串连接:
#!/bin/bash
content=""
for ((i = 0 ; i <= 10 ; i++)); do
content="${content}${i}n"
done
echo -ne "${content}"
在这种情况下,bash将内容理解为变量而不是缓冲区。