如果使用+ =串联,如何在bash脚本中追加换行符?

时间:2019-06-28 01:56:43

标签: bash

我正在使用bash脚本生成数据文件。无法弄清楚如何添加换行符..!

#!/bin/bash

DATA=""
FILE="test.csv"

for ((i=1;i<=10;i++)) ; do
     DATA+="A,B\n"
done

echo $DATA >> $FILE

它打印

$ cat test.csv
A,B\nA,B\nA,B\nA,B\nA,B\nA,B\nA,B\nA,B\nA,B\nA,B\n
$ _

我期望的是:

A,B
A,B
A,B
A,B
A,B
A,B
A,B
A,B
A,B
A,B

直接回显到文件时很容易做到,但是出于性能原因,我开始使用+ =进行级联以将信息存储在var中,并将突发发送到文件中。

如果使用+ =,则无法确定如何连接换行符。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

如果您想将格式化的结果实际嵌入到变量中,请为其加引号。

#!/bin/bash

DATA=""
FILE="test.csv"

for ((i=1;i<=10;i++)) ; do
     DATA+=$'A,B\n'
done

echo "$DATA" >> "$FILE"

这两项更改是使用$'fmt'和引用echo的参数。

您也可以使用printf进行更精确的控制。

#!/usr/bin/env bash

DATA=""
FILE="test.csv"

nl=""
for ((i=1;i<=10;i++)) ; do
     printf -v DATA '%s%s%s' "$DATA" "$nl" "A,B"
     nl="\n"
done

echo "$DATA" >> "$FILE"

这使用$nl变量来避免在$DATA前面加上换行符。

另一种变化形式:

#!/usr/bin/env bash

FILE="test.csv"

nl=""
for ((i=1;i<=10;i++)) ; do
     printf '%s%s' "$nl" "A,B"
     nl="\n"
done >> "$FILE"

这通过将循环的输出直接定向到$DATA来避免中间变量$FILE。请注意,您可以根据需要将重定向直接应用于printf。重定向循环输出MIGHT的速度会更快一些,因为它只打开一次文件,但是差异可能可以忽略不计。

答案 1 :(得分:1)

您可以在回显中包括该选项:

/opt/mssql-tools/bin/sqlcmd -E -S localhost -Q "SHUTDOWN"

echo -e $DATA >> $FILE 使echo能够解释反斜杠转义符。