#mysql #bash #escaping #quoting
#mysql #bash #экранирование #цитирование
Вопрос:
Есть такой скрипт:
#! /bin/bash
typeset -i i END
let END=500 i=1
remainder=1
accum="use yola_test;n"
for ((i=1;i<=END; i)); do
# str1=$( echo "$i" | md5sum | md5sum )
title="title_$i"
# "${str1:2:20}"
accum="${accum}CALL add_new_enterprise("$title");n"
let "remainder=$i % 100"
if [ $remainder -eq 0 ]; then
accum="${accum}SELECT count(*) as `enterprises:` FROM enterprise;n"
mysql --host=l --port=0 --user=r --password='!' --execute="$accum"
accum="use yola_test;n"
fi
done
Но для каждого n он выдает мне «Для пейджера установлен стандартный вывод», могу ли я избежать этого, я знаю, что при повторении этого я должен использовать опцию -e, но я прочитал некоторые материалы о цитировании ANSI-C, но нигде нет примеров, как это использовать.
Я пытался это сделать
mysql --host=l --port=0 --user=r --password='!' --execute="$( echo -e "$accum" )"
но это не имеет эффекта, и я думаю, что вызов echo увеличит время выполнения.
Ответ №1:
ответ @pgl — лучший подход для этого случая, но если вам действительно нужно было встроить переводы строк в значение переменной, проще всего использовать $'...'
форму кавычек bash:
accum=$'use yola_test;n'
...
accum="${accum}CALL add_new_enterprise("$title");"$'n'
...etc
Обратите внимание, что во втором примере выше используется сочетание типов кавычек; двойные кавычки для первой части, чтобы разрешить интерполяцию переменных, а затем $'...'
для части, которая нуждается в интерпретации escape-последовательности.
Кстати, другим подходом было бы определить переменную для хранения новой строки:
nl=$'n'
accum="use yola_test;${nl}"
...
accum="${accum}CALL add_new_enterprise("$title");${nl}"
...etc
Комментарии:
1. и затем я делаю «echo -e $ accum» без перевода строк на выходе ((
2. Попробуйте
echo -e "$accum"
— двойные кавычки необходимы, чтобы оболочка не превращала переводы строк (и табуляции, и …) в разрывы слов, которыеecho
затем превращаются в пробелы.
Ответ №2:
«Для ПЕЙДЖЕРА установлен стандартный вывод» из MySQL — чтобы остановить его отображение, просто удалите экземпляры n из своего кода; они вам не нужны.