как распознать n в bash

#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 из своего кода; они вам не нужны.