Как избежать двойных кавычек внутри двойных кавычек? - PullRequest
238 голосов
/ 01 октября 2010

Кто-нибудь может показать мне, как избежать двойных кавычек внутри двойной строки в bash?

Например, в моем сценарии оболочки

#!/bin/bash

dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"

Я не могу получить ENCLOSED BY \" с двойной кавычкой правильно. Я не могу использовать одинарные кавычки для моей переменной, потому что я хочу использовать переменную $dbtable.

Ответы [ 8 ]

251 голосов
/ 01 октября 2010

Используйте обратную косую черту:

echo "\""     # Prints one " character.
61 голосов
/ 28 февраля 2015

Простой пример экранирования кавычек в оболочке:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Это делается путем завершения уже открытого ('), размещения одного экранированного (\'), затем открытия другого (').

В качестве альтернативы:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

Это делается путем завершения уже открытой одной ('), помещения цитаты в другую цитату ("'"), затем открытия другой (').

Дополнительные примеры: Экранирование одинарных кавычек в одиночных кавычках

45 голосов
/ 20 февраля 2017

Я не знаю, почему эта старая проблема появилась сегодня в списках, помеченных bash, но на всякий случай для будущих исследователей, имейте в виду, что вы можете избежать побега, используя ascii-коды символов, которые вам нужно отобразить.Пример:

echo -e "this is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22"                                                                                                          
this is "'"'"text"'"'" 

\x22 - это код ascii (в шестнадцатеричном формате) для двойных кавычек и \x27 для одинарных кавычек.Точно так же вы можете отобразить любой символ.

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

Для назначения переменных этоэквивалентен:

$ a=$'this is \x22text\x22'                                                                                                                                               
$ echo "$a"                                                                                                                                                               
this is "text"

Если переменная уже установлена ​​другой программой, вы все равно можете применять двойные / одинарные кавычки с помощью sed или аналогичных инструментов.Пример:

$ b="just another text here"
$ echo "$b"
just another text here
$ sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator
just another "0" here #this is not what i wanted to be
$ sed 's/text/\x22\x27\0\x27\x22/' <<<"$b"
just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way.
22 голосов
/ 17 августа 2015

Bash позволяет размещать строки рядом друг с другом, и в итоге они будут склеены.

Так вот:

$ echo "Hello"', world!'

производит

Hello, world!

Хитрость заключается в чередовании одинарных и двойных кавычек по мере необходимости.К сожалению, это быстро становится очень грязным.Например:

$ echo "I like to use" '"double quotes"' "sometimes"

производит

I like to use "double quotes" sometimes

В вашем примере, я бы сделал это примерно так:

$ dbtable=example
$ dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES'
$ echo $dbload

, который производит следующеевывод:

load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES

Сложно увидеть, что здесь происходит, но я могу комментировать это с помощью кавычек Unicode.Следующее не будет работать в bash - это просто для иллюстрации:

dbload= 'load data local infile "' «'gfpoint.csv'» '" into' «table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '» '"' «' LINES ”'TERMINATED BY "'“ '\n' ”'" IGNORE 1 LINES'

Кавычки, подобные« '' "в приведенном выше, будут интерпретироваться bash.Кавычки типа " ' будут заканчиваться полученной переменной.

Если я приведу ту же обработку в предыдущем примере, это будет выглядеть так:

$ echo «I like to use» "double quotes" «sometimes»

15 голосов
/ 30 октября 2012

check printf ...

#!/bin/bash
mystr="say \"hi\""

Без использования printf

echo -e $mystr

вывод: произнесите "hi"

Using printf

echo -e $(printf '%q' $mystr)

вывод: скажем \ "привет \"

13 голосов
/ 14 ноября 2017

Сохранить символ двойной кавычки как переменную:

dqt='"'
echo "Double quotes ${dqt}X${dqt} inside a double quoted string"

Вывод:

Double quotes "X" inside a double quoted string
9 голосов
/ 12 января 2017

Используйте $ "string".

В этом примере это будет

dbload = $ "загрузить данные локального файла \" 'gfpoint.csv' \ "в таблицу. «

Примечание (со справочной страницы ):

Строка в двойных кавычках, перед которой стоит знак доллара ($ "string"), приведет к переводу строки в соответствии с текущей локалью. Если текущим языковым стандартом является C или POSIX, знак доллара игнорируется. Если строка переведена и заменена, замена заменяется двойными кавычками.

0 голосов
/ 16 февраля 2017

добавьте "\" перед двойной кавычкой, чтобы избежать ее, вместо \

#! /bin/csh -f

set dbtable = balabala

set dbload = "load data local infile "\""'gfpoint.csv'"\"" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"\""' LINES TERMINATED BY "\""'\n'"\"" IGNORE 1 LINES"

echo $dbload
# load data local infile "'gfpoint.csv'" into table balabala FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "''" IGNORE 1 LINES
...