for 循环中的换行符

for 循环中的换行符

如何在 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 语句中嵌入换行符。VJ

在 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

与其他建议相反,最好不要尝试在echoprintf命令中嵌入文字控制字符。它们很难看到,很难编辑,并且如果您只是这样做,会弄乱脚本的显示cat

请注意,在以上所有内容中,我都假设您希望在“成功”注释之前和之后都换行。如果那不是您的意图,请相应地修改这些命令。

相关内容