Ответ 1
Использовать обратную косую черту:
echo "\"" # Prints one " character.
Может ли кто-нибудь показать мне, как избежать двойной кавычки внутри двойной строки в 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
.
Использовать обратную косую черту:
echo "\"" # Prints one " character.
Простой пример экранирования кавычек в оболочке:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
Сделано, закончив уже открытое ('
), разместив escape-код (\'
), затем откройте еще один ('
).
В качестве альтернативы:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
Сделано, закончив уже открытую ('
), поставив цитату в другую цитату ("'"
), затем открыв другую ('
).
Другие примеры: Сброс одиночных кавычек в однокасканных строках
Я не знаю, почему эта старая проблема появилась сегодня в тегах 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.
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
"
проверить printf...
#!/bin/bash
mystr="say \"hi\""
Без использования printf
echo -e $mystr
вывод: скажем "привет"
Использование printf
echo -e $(printf '%q' $mystr)
вывод: say\ "hi \"
Используйте $ "string".
В этом примере это было бы,
dbload = $ "load data local infile \" 'gfpoint.csv'\"в таблицу $ dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ЛИНИИ, ПРЕРЫВАННЫЕ \"'\n' \" IGNORE 1 LINES "
Примечание (со страницы руководства):
Строка с двойными кавычками, перед которой стоит знак доллара ($ "строка"), приведет к тому, что строка будет переведена в соответствии с текущей локалью. Если текущий язык - C или POSIX, знак доллара игнорируется. Если строка переводится и заменяется, замена выполняется двойным образом.
Сохраните символ двойной кавычки как переменную:
dqt='"' echo "Double quotes ${dqt}X${dqt} inside a double quoted string"
Вывод:
Double quotes "X" inside a double quoted string
добавьте "\"
перед двойной цитатой, чтобы избежать его, вместо \
#! /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