Как избежать двойной кавычки внутри двойных кавычек?

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

Например, в моей оболочке script

#!/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.

Ответ 1

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

echo "\""     # Prints one " character.

Ответ 2

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

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

Сделано, закончив уже открытое ('), разместив escape-код (\'), затем откройте еще один (').

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

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

Сделано, закончив уже открытую ('), поставив цитату в другую цитату ("'"), затем открыв другую (').

Другие примеры: Сброс одиночных кавычек в однокасканных строках

Ответ 3

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

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

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

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

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

$ 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.

Ответ 4

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"

Ответ 5

проверить printf...

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

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

echo -e $mystr

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

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

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

вывод: say\ "hi \"

Ответ 6

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

В этом примере это было бы,

dbload = $ "load data local infile \" 'gfpoint.csv'\"в таблицу $ dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ЛИНИИ, ПРЕРЫВАННЫЕ \"'\n' \" IGNORE 1 LINES "

Примечание (со страницы руководства):

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

Ответ 7

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

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

Вывод:

Double quotes "X" inside a double quoted string

Ответ 8

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

#! /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