我正在使用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中,并将突发发送到文件中。
如果使用+ =,则无法确定如何连接换行符。
感谢您的帮助。
答案 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能够解释反斜杠转义符。