如何在 bash 中的 for 循环中创建换行符?我试过了,echo -e
但不起作用。当我打开日志文件时,所有内容都在一行上。
for i in */ ; do
sitefolder="$HOME/domains/${i%%/}/public_html"
if [ -d "$sitefolder" ]; then
echo -e "\nBackup of ${i%%/} successfull" >> $logs/backups.log
fi
done
我做错了什么?谢谢
答案1
在该行中:
echo -e "\nBackup of ${i%%/} successfull" >> $logs/backups.log
将换行符 ( \n
) 替换为回车符 + 换行符 ( \r\n
) 以确保两者都发生。
欲了解更多信息,可以查看这个 Programmers.stackexchange.com 问题:'\n' 和 '\r\n' 之间的区别以及这个 StackOverflow 问题:不同线路在不同站台结束的历史原因
答案2
您可以一起使用CTRL
+ ,然后按下以在 echo 语句中嵌入换行符。V
J
在 Unix 和 Linux 系统上,CTRL + V
表示后面的字符被解释为控制字符。
答案3
该echo
命令有多种版本,不同版本可以以不同的方式处理其可选参数。使用任何可选参数echo
都是不可移植的。最简单的解决方案是添加另一个echo
,如下所示:
echo >> $logs/backups.log
echo "Backup of ${i%%/} successful" >> $logs/backups.log
或者像这样:
{
echo
echo "Backup of ${i%%/} successful"
} >> $logs/backups.log
或者,您可以使用printf
而不是echo
,至少从可移植性的角度来看,这是目前首选。
printf "\nBackup of ${i%%/} successful\n" >> $logs/backups.log
所有这些解决方案都会按照 Unix 惯例在每行之间添加换行符。一些 Windows 编辑器将单个换行符理解为行尾。其他编辑器(如记事本)则不理解,并将您的文件显示为一行。
解决该问题的一个方法是再次使用printf
。
printf "\r\nBackup of ${i%%/} successful\r\n" >> $logs/backups.log
与其他建议相反,最好不要尝试在echo
或printf
命令中嵌入文字控制字符。它们很难看到,很难编辑,并且如果您只是这样做,会弄乱脚本的显示cat
。
请注意,在以上所有内容中,我都假设您希望在“成功”注释之前和之后都换行。如果那不是您的意图,请相应地修改这些命令。