У меня есть сценарий 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 Грега Вулджа и другие страницы на этом сайте.
>>
), а не перезаписывать (>
).-n
не работает?Почему нет:
mysql -N -u$DBUSER -p$DBPASS -h$DBHOST -D$DBNAME -e "SELECT
vhost FROM test;" > vhost