回声环境变量,保持换行符不变?
回声环境变量,保持换行符不变?
我想为一些模板创建一些脚本,并将它们插入到我的项目文件夹中。我想使用一个shell脚本来实现这个目标,并且这些模板非常小,所以我想将它们嵌入到shell脚本中。问题是,echo
似乎忽略了字符串中的换行符。要么是这样,要么字符串本身就没有换行符。下面是一个例子:\n
MY_STRING=" Hello, world! This Is A Multi lined String." echo -e $MY_STRING
\n这将输出:\n
Hello, world! This Is A Multi lined String.
\n我猜想echo
是罪魁祸首。如何让它识别换行符呢?
从上面的代码中,我们可以看到一个问题:在使用echo
命令打印一个环境变量$MY_STRING
时,输出结果并没有保留原始字符串中的换行符。这可能导致一些文本格式混乱的问题。
这个问题的原因是echo
命令在处理输出时会自动移除字符串中的换行符。这可能是为了确保打印的内容在一行内显示,但这也意味着我们无法保留原始字符串中的换行格式。
为了解决这个问题,我们可以使用printf
命令来代替echo
命令。printf
命令允许我们使用格式化字符串来控制输出的格式。具体的解决方法如下:
printf "%s\n" "$MY_STRING"
在这个命令中,我们使用了%s\n
作为格式化字符串。%s
表示输出一个字符串,而\n
表示插入一个换行符。这样,我们就可以保留原始字符串中的换行符,并将其打印出来。
通过使用printf
命令,我们可以确保环境变量$MY_STRING
在输出时保持换行符的完整。这样,我们可以正确地处理和显示包含换行符的字符串内容。
问题出现的原因是在环境变量插值周围缺少双引号。解决方法是在插值周围加上双引号。
当解析命令行时,shell会对空白字符进行规范化。如果在命令行中编写一个简单的C程序来打印出其argv数组,可以看到这一点。
与之相反,使用引号引用的话,整个字符串都在argv[0]中,包括换行符。
另外,也可以使用here documents(使用cat而不是echo)来处理这个问题。可以在here document中插入一个变量。
希望这些修改能有所帮助。
echo -e "$MY_STRING"
argv[0]='Hello,' argv[1]='world!' argv[2]='This' argv[3]='Is' argv[4]='A' argv[5]='Multi' argv[6]='lined' argv[7]='String.'
cat <<"HERE" foo Bar HERE
cat <<HERE $MY_STRING HERE