Задать вопрос

Как правильно заэкранировать кавычки в bash?

Есть некий скрипт на bash, в котором есть данная переменная:
Q='SELECT *
     FROM blabla.users s
     LEFT JOIN auth.users u on s.userId = u.userId
     WHERE
     s.userId is not NULL and
     not( (u.email like "test@%" OR u.email like "a@%") ) and u.deactivated is NULL
     INTO OUTFILE '/home/blalba/$F.csv'
     FIELDS TERMINATED BY ','
     LINES TERMINATED BY '\n';
     '


при выполнении - ругается:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '/home/blabla/Пт_июл__8_13:20:37_MSK_2016.csv
FIELDS TERMINATED BY ,
' at line 7
При bash -x явно видно, что не используются кавычки в комманде FIELDS и, соответсвенно, в следующей тоже не будут использоваться, на что SQL и ругается:
+ Q='SELECT *
    FROM blabla.users s
    LEFT JOIN auth.users u on s.userId = u.userId
    WHERE
    s.userId is not NULL and
    not( (u.email like "test@%" OR u.email like "a@%") ) and u.deactivated is NULL
    INTO OUTFILE /home/blabla/Пт_июл__8_13:20:37_MSK_2016.csv
    FIELDS TERMINATED BY ,
    LINES TERMINATED BY \n;
    '


Так вот, как правильно заэкранировать ' ?
  • Вопрос задан
  • 293 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
BuriK666
@BuriK666
Компьютерный псих
Одинарная кавычка не экранируется, используйте двойные
F="asd";
Q="SELECT *
     FROM blabla.users s
     LEFT JOIN auth.users u on s.userId = u.userId
     WHERE
     s.userId is not NULL and
     not( (u.email like \"test@%\" OR u.email like \"a@%\") ) and u.deactivated is NULL
     INTO OUTFILE '/home/blalba/$F.csv'
     FIELDS TERMINATED BY ','
     LINES TERMINATED BY '\n';
     "
echo "$Q"
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
В такого рода случаях лучше использовать EOF

cat << EOF | psql ---params
BEGIN;

`pg_dump ----something`

update table .... statement ...;

END;
EOF
stackoverflow.com/questions/2500436/how-does-cat-e...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы