Назад | Перейти на главную страницу

Убрать "n" \ новую строку из эха в файл

У меня есть сценарий bash, который извлекает немного текста из внешней базы данных MySQL. В большинстве случаев это 4 строки, каждая на своей строке. Этот текст (в целом) необходимо поместить в файл. Теперь сценарий извлекает информацию из базы данных MySQL и помещает ее в переменную. Затем я повторяю его в файле:

echo -ne $variable > file

Проблема в том, что "n" также выводится / выводится в файл. Как это:

here is sentence number 1
nthere is number 2
nals here comes number 3
nlast but not least number 4

каким-то образом печатается что-то вроде новой строки, и мне нужен текст без 'n'.

РЕДАКТИРОВАТЬ 1 - копия сценария Bash:

#!/bin/bash

DBHOST='xx.xxx.xx.xxxx'
DBUSER='xxxxxx'
DBPASS='xxxxxx'
DBNAME='xxxxxx'

mysql -N -u$DBUSER -p$DBPASS -h$DBHOST -D$DBNAME -e "SELECT id,vhost FROM test;" | while read id vhost;
do
echo -ne $vhost > vhost
done

По понятным причинам я удалил детали базы данных.

ИЗМЕНИТЬ 2 - Я использую следующую версию Bash и Ubuntu:

Ubuntu: 12.04.2 Bash: 4.2.25

Первая и самая большая проблема заключается в том, что вам нужны кавычки вокруг вашей переменной.

echo -ne "$variable" > file

Тогда я бы попробовал опустить один или оба -e и -n. В идеале, printf следует использовать вместо echo так как он более портативный.

Редактировать:

Спасибо, что показали дополнительные части вашего скрипта, которые необходимы для диагностики проблемы.

Если поле vhost может содержать буквальную строку "\ n" (обратная косая черта-n не перевод строки) в его содержание затем вы должен использовать -r вариант с read если вы хотите сохранить обратную косую черту. Фактически, вы почти всегда должны использовать -r все равно по привычке. Сохраняя обратную косую черту, -e вариант echo интерпретирует буквальный «\ n» в качестве escape-последовательности, которая представляет новую строку и выводит новую строку вместо «n».

mysql -N -u$DBUSER -p"$DBPASS" -h$DBHOST -D$DBNAME -e "SELECT id,vhost FROM test;" | 
while read -r id vhost;
do
    echo -en "$vhost"
done > vhost

Вы можете переместить перенаправление в конец while цикл, чтобы избежать многократного открытия и закрытия выходного файла и перезаписи содержимого на каждой итерации. Вы можете использовать завершающую черту также как символ продолжения строки для облегчения чтения.

Привычки, о которых я упоминал ранее, в том числе всегда цитировать переменную для вывода, должны хорошо укорениться. Они предотвращают неожиданное поведение в неподходящее время. Наверное, лучший справочник по изучению этих привычек - Bash Грега Вулджа и другие страницы на этом сайте.

  1. Вы, вероятно, захотите добавить (>>), а не перезаписывать (>).
  2. Вы уверены, что удаление -n не работает?
  3. Почему нет:

    mysql -N -u$DBUSER -p$DBPASS -h$DBHOST -D$DBNAME -e "SELECT vhost FROM test;" > vhost