Как добавить символ новой строки в скрипте bash, если объединить с помощью + =? - PullRequest
1 голос
/ 28 июня 2019

Я генерирую файл данных, используя скрипт 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 ]

2 голосов
/ 28 июня 2019

Если вы хотите встроить результат форматирования в переменную, для этого есть кавычка.

#!/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, если хотите.Перенаправление вывода цикла МОЖЕТ быть немного быстрее, потому что он открывает файл только один раз, но разница, вероятно, будет незначительной.

1 голос
/ 28 июня 2019

Вы можете включить опцию в своем эхо:

echo -e $DATA >> $FILE

-e позволяет эхо интерпретировать обратные слэши.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...