不能在bash脚本中打印字符串开头的换行符



我在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将内容理解为变量而不是缓冲区。

最新更新