Как я могу избежать двойных кавычек внутри двойной строки в 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
.
$dbtable
, существует риск. Это было бы очень редко, поскольку конечные пользователи обычно не используют SSH для загрузки своих данных.Ответы:
Используйте обратную косую черту:
источник
x=ls; if [ -f "$(which "\""$x"\"")" ]; then echo exists; else echo broken; fi;
дает сломано, тогда как... [ -f "$(which $x)" ]; ...
или... [ -f $(which "$x") ]; ...
работает просто отлично. Проблемы могут возникнуть, когда либо$x
результат, либо результат$(which "$x")
с пробелом или другим специальным символом. Обходной путь - использовать переменную для хранения результатаwhich
, но действительно ли bash не в состоянии избежать кавычки или я что-то не так делаю?grep -oh "\"\""$counter"\""\w*"
как часть синтаксиса bash, где in$counter
является переменной. это не нравится никаких мыслейПростой пример экранирования кавычек в оболочке:
Это делается путем завершения уже открытого (
'
), размещения экранированного (\'
), а затем открытия другого ('
).В качестве альтернативы:
Это делается путем завершения уже открытой one (
'
), размещения цитаты в другой quote ("'"
) и последующего открытия другой ('
).Дополнительные примеры: экранирование одинарных кавычек в одиночных кавычках
источник
echo "abc\"abc"
достаточно произвести,abc"abc
как в ответе Питера.Я не знаю, почему эта старая проблема появилась сегодня в списках с тегами Bash, но на всякий случай для будущих исследователей, имейте в виду, что вы можете избежать побега, используя ASCII-коды символов, которые вам нужно отображать.
Пример:
\x22
код ASCII (в шестнадцатеричном формате) для двойных и\x27
одинарных кавычек. Точно так же вы можете повторить любой персонаж.Я полагаю, что если мы попытаемся отразить вышеуказанную строку с помощью обратной косой черты, нам понадобится беспорядочное эхо с двумя строками обратной косой черты ... :)
Для присвоения переменной это эквивалентно:
Если переменная уже установлена другой программой, вы все равно можете применять двойные / одинарные кавычки с помощью sed или аналогичных инструментов.
Пример:
источник
echo 'export PS1='\[\033[00;31m\]${?##0}$([ $? -ne 0 ] && echo \x22 \x22)\[\033[00;32m\]\u\[\033[00m\]@\[\033[00;36m\]\h\[\033[00m\][\[\033[01;33m\]\d \t\[\033[00m\]] \[\033[01;34m\]\w\n\[\033[00m\]$( [ ${EUID} -ne 0 ] && echo \x22$\x22 || echo \x22#\x22 ) '' >> ~/.profile
Bash позволяет размещать строки рядом друг с другом, и в итоге они будут склеены.
Итак, это:
производит
Хитрость заключается в чередовании одинарных и двойных кавычек по мере необходимости. К сожалению, это быстро становится очень грязным. Например:
производит
В вашем примере я бы сделал это примерно так:
который производит следующий вывод:
Трудно увидеть, что здесь происходит, но я могу аннотировать это с помощью кавычек 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 ...
Без использования printf
Вывод: скажи "привет"
Использование printf
Вывод: скажи \ "привет \"
источник
printf
экранируется больше символов, например'
,(
и)
printf %q
генерирует строки, готовые дляeval
, а не отформатированные дляecho -e
.printf
их бесполезным использованиемecho
. Оба ваших примера не соответствуют действительности. Правильное решение заключается в двойных кавычках переменной.Сохраните символ двойной кавычки как переменную:
Вывод:
источник
Используйте $ "string".
В этом примере это было бы,
Примечание (со страницы руководства ):
источник
Добавить
"\"
перед двойной кавычкой, чтобы избежать его, вместо\
источник
csh
ответ наbash
вопрос? Два совершенно различны и несовместимы.