Допустим, у вас есть Bash, alias
как:
alias rxvt='urxvt'
который работает отлично.
Однако:
alias rxvt='urxvt -fg '#111111' -bg '#111111''
не будет работать, и не будет:
alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''
Итак, как вы в конечном итоге сопоставляете открывающие и закрывающие кавычки внутри строки после того, как вы избежали кавычек?
alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''
кажется неловким, хотя он будет представлять одну и ту же строку, если вам разрешено объединять их таким образом.
"\""
поэтому их следует использовать по возможности перед ответом @ liori.Ответы:
Если вы действительно хотите использовать одинарные кавычки во внешнем слое, помните, что вы можете склеить оба вида цитат. Пример:
Объяснение того, как
'"'"'
интерпретируется просто'
:'
Завершите первую цитату, которая использует одинарные кавычки."
Начните вторую цитату, используя двойные кавычки.'
Процитированный персонаж."
Завершите вторую цитату, используя двойные кавычки.'
Начните третью цитату, используя одинарные кавычки.Если вы не поместите пробелы между (1) и (2) или между (4) и (5), оболочка будет интерпретировать эту строку как одно длинное слово.
источник
alias splitpath='echo $PATH | awk -F : '"'"'{print "PATH is set to"} {for (i=1;i<=NF;i++) {print "["i"]",$i}}'"'"
Это работает, когда в строке псевдонима есть как одинарные, так и двойные кавычки!alias serve_this_dir='ruby -rrack -e "include Rack;Handler::Thin.run Builder.new{run Directory.new'"'"''"'"'}"'
'\''
это гораздо более читабельно в большинстве контекстов, чем'"'"'
. На самом деле, первое почти всегда четко различается внутри строки в одинарных кавычках, и, таким образом, это просто вопрос его семантического отображения в значении «это экранированная кавычка», как\"
в случае строк в двойных кавычках. Принимая во внимание, что последний сливается в одну строку цитат и во многих случаях нуждается в тщательном осмотре, чтобы правильно различить.Я всегда просто заменяю каждую встроенную одинарную кавычку на последовательность:
'\''
(то есть: кавычка с кавычками в обратном слэше), которая закрывает строку, добавляет экранированную одинарную кавычку и снова открывает строку.Я часто использую функцию «quotify» в моих скриптах Perl, чтобы сделать это для меня. Шаги будут:
Это в значительной степени заботится обо всех случаях.
Жизнь становится веселее, когда вы внедряете
eval
в свои shell-скрипты. По сути, вы должны заново пересчитать все!Например, создайте сценарий Perl с именем quotify, содержащий приведенные выше операторы:
затем используйте его для генерации строки в правильных кавычках:
результат:
который затем можно скопировать / вставить в команду псевдонима:
(Если вам нужно вставить команду в eval, запустите цитату еще раз:
результат:
который можно скопировать / вставить в eval:
источник
set -x
и ,echo "here's a string"
и вы увидите , что Баш Выполняетecho 'here'\''s a string'
. (set +x
чтобы вернуть нормальное поведение)Поскольку синтаксис Bash 2.04
$'string'
(вместо просто'string'
; предупреждение: не путайте с$('string')
) является еще одним механизмом цитирования, который допускает escape-последовательности, подобные ANSI C, и выполняет расширение до версии в одинарных кавычках.Простой пример:
В твоем случае:
Обычные экранирующие последовательности работают как положено:
Ниже приведена копия + вставлена соответствующая документация из
man bash
(версия 4.4):Слова вида $ 'string' обрабатываются специально. Слово расширяется до строки, символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C. Escape-последовательности с обратной косой чертой, если они есть, декодируются следующим образом:
Расширенный результат заключен в одинарные кавычки, как если бы знак доллара отсутствовал.
См. Цитаты и экранирование: ANSI C как строки на вики bash-hackers.org для более подробной информации. Также обратите внимание, что файл «Bash Changes» ( обзор здесь ) много упоминает об изменениях и исправлениях ошибок, связанных с
$'string'
механизмом цитирования.Согласно unix.stackexchange.com Как использовать специальный символ как обычный? он должен работать (с некоторыми вариациями) в bash, zsh, mksh, ksh93 и FreeBSD и busybox sh.
источник
echo $'foo\'b!ar'
!ar': event not found
> echo $BASH_VERSION
4.2.47(1)-release
> echo $'foo\'b!ar'
foo'b!ar
$'
так что, вероятно, самый простой способ - попробовать это самостоятельно на старых системах.e. Bash no longer inhibits C-style escape processing ($'...') while performing pattern substitution word expansions.
взято из tiswww.case.edu/php/chet/bash/CHANGES . Все еще работает в 4.3.42, но не в 4.3.48.Я не вижу записи в его блоге (ссылка PLS?), Но согласно справочному руководству GNU :
так что bash не поймет
alias x='y \'z '
однако вы можете сделать это, если заключите в двойные кавычки:
источник
Я могу подтвердить, что с помощью
'\''
одинарной кавычки внутри строки в одинарных кавычках работает в Bash, и это можно объяснить так же, как аргумент «склеивания» из предыдущего потока. Предположим, у нас есть строка в кавычках:'A '\''B'\'' C'
(здесь все кавычки одинарные). Если он передается эхо, он печатает следующее:A 'B' C
. В каждой'\''
первой кавычке закрывается текущая строка в одинарных кавычках, следующая\'
склеивает одинарную кавычку с предыдущей строкой (\'
это способ указать одиночную кавычку без начала строки в кавычках), а последняя кавычка открывает еще одну строку в одинарных кавычках.источник
alias something='A '\''B'\'' C'
результате присваивания получаетсяsomething
одна строка, поэтому даже если правая часть присваивания не является технически единственной строкой, я не думаю, что это имеет большое значение.'A ' + ' + 'B' + ' + ' C'
. Другими словами, решение для вставки символов одинарных кавычек внутри строки в одинарных кавычках должно позволить мне создать такую строку и распечатать ее. Однако это решение не будет работать в этом случае.STR='\''; echo $STR
, Как и задумано, BASH действительно не позволяет этого.'\''
работает на bash. Не могли бы вы указать, какие разделы gnu.org/software/bash/manual/bashref.html определяют такое поведение?Обе версии работают либо с конкатенацией с использованием экранированного символа одинарных кавычек (\ '), либо с конкатенацией, заключающей символ одинарных кавычек в двойные кавычки ("'").
Автор вопроса не заметил, что в конце его последней попытки побега была добавлена одиночная кавычка ('):
Как вы можете видеть в предыдущем хорошем фрагменте ASCII / Unicode, за последней экранированной одинарной кавычкой (\ ') следует ненужная одинарная кавычка ('). Использование подсветки синтаксиса, подобной тому, что представлен в Notepad ++, может оказаться очень полезным.
То же самое верно для другого примера, подобного следующему:
Эти два прекрасных примера псевдонимов очень запутанно и запутанно показывают, как можно выстроить файл. То есть из файла с большим количеством строк вы получаете только одну строку с запятыми и пробелами между содержимым предыдущих строк. Чтобы понять смысл предыдущего комментария, ниже приведен пример:
источник
Простой пример экранирования кавычек в оболочке:
Это сделано, заканчивая уже открытый one (
'
), помещая экранированный one (\'
), затем открывая другой ('
). Этот синтаксис работает для всех команд. Это очень похоже на первый ответ.источник
Я не обращаю особого внимания на проблему цитирования, потому что иногда бывает разумно рассмотреть альтернативный подход.
который вы можете затем назвать как:
идея в том, что теперь вы можете использовать псевдоним, не заботясь о кавычках:
или, если вам
#
по какой-либо причине необходимо включить во все вызовы:который вы можете затем назвать как:
тогда, конечно, псевдоним:
(Ой, я думаю, что я как-то обратился к цитированию :)
источник
Поскольку нельзя заключать в одинарные кавычки одинарные кавычки, самый простой и читаемый вариант - использовать строку HEREDOC
В приведенном выше коде HEREDOC отправляется на
cat
команде, а ее выход назначается переменной через нотацию подстановки команд$(..)
Необходимо поместить одинарную кавычку вокруг HEREDOC, поскольку она находится в пределах
$()
источник
dash
оболочка по умолчанию в сценариях запуска Ubuntu и в других местах.Я просто использую шелл-коды .. например
\x27
или\\x22
как применимо. Никаких хлопот, правда.источник
x27
(на Centos 6.6)Большинство из этих ответов затрагивают конкретный случай, о котором вы спрашиваете. Существует общий подход друг , и я разработал , что позволяет произвольно процитировать в случае , если вам нужно процитировать Баш команд через несколько слоев расширения оболочки, например, через SSH,
su -c
,bash -c
и т.д. Существует один основной примитив вам нужно, здесь в родном bash:Это делает именно то, что говорит: он заключает в кавычки каждый аргумент индивидуально (конечно, после расширения bash):
Это делает очевидную вещь для одного уровня расширения:
(Обратите внимание, что двойные кавычки
$(quote_args ...)
необходимы для того, чтобы превратить результат в один аргументbash -c
.) И его можно использовать более широко для правильного цитирования через несколько уровней расширения:Приведенный выше пример:
quote_args
индивидуально и затем объединяет полученный результат в единый аргумент с внутренними двойными кавычками.bash
,-c
и уже один раз процитированный результат с шага 1, а затем объединяет результат в один аргумент с внешними двойными кавычками.bash -c
.Это идея в двух словах. Вы можете сделать довольно сложные вещи с этим, но вы должны быть осторожны с порядком оценки и с тем, какие подстроки цитируются. Например, следующее делает неправильные вещи (для некоторого определения «неправильно»):
В первом примере, Баш немедленно расширяется
quote_args cd /; pwd 1>&2
на две отдельные команды,quote_args cd /
иpwd 1>&2
, таким образом , по - прежнему УХО ,/tmp
когдаpwd
выполняется команда. Второй пример иллюстрирует аналогичную проблему для сглаживания. Действительно, та же самая основная проблема возникает со всеми расширениями bash. Проблема здесь в том, что подстановка команд не является вызовом функции: она буквально оценивает один скрипт bash и использует его вывод как часть другого скрипта bash.Если вы попытаетесь просто избежать операторов оболочки, вы потерпите неудачу, потому что полученная в результате строка
bash -c
является просто последовательностью строк в индивидуальном кавычке, которые затем не интерпретируются как операторы, что легко увидеть, если вы откроете строку, которая будет были переданы в bash:Проблема в том, что вы преувеличиваете. Вам нужно, чтобы операторы были заключены в кавычки как входные данные для включения
bash -c
, что означает, что они должны находиться за пределами$(quote_args ...)
подстановки команд.Следовательно, что вам нужно сделать в самом общем смысле, это заключить в кавычки каждое слово команды, не предназначенной для расширения во время подстановки команд, отдельно и не применять никаких дополнительных кавычек к операторам оболочки:
Как только вы это сделаете, вся строка станет честной игрой для дальнейшего цитирования на произвольных уровнях оценки:
и т.п.
Эти примеры могут показаться перегруженными, если учесть, что такие слова, как
success
,sbin
иpwd
не нужно заключать в кавычки, но ключевой момент, который следует помнить при написании сценария с произвольным вводом, заключается в том, что вы хотите процитировать все, в чем вы не уверены, что не ' не нужно цитировать, потому что вы никогда не знаете, когда пользователь добавитRobert'; rm -rf /
.Чтобы лучше понять, что происходит под одеялом, вы можете поиграть с двумя небольшими вспомогательными функциями:
это перечислит каждый аргумент команды перед ее выполнением:
источник
vagrant ssh -c {single-arg} guest
. В{single-arg}
потребности следует рассматривать в качестве одного арга , потому что бродяга принимает следующий ARG после него имени гостя. Порядок не может быть изменен. Но мне нужно было передать команду и ее аргументы внутри{single-arg}
. Таким образом , я использовал вашquote_args()
процитировать команду и ее аргументы, и поставить двойные кавычки вокруг результата, и он работал как шарм:vagrant ssh -c "'command' 'arg 1 with blanks' 'arg 2'" guest
. Спасибо!!!ИМХО, реальный ответ заключается в том, что вы не можете избежать одинарных кавычек в одиночных кавычках.
Это невозможно.
Если мы предполагаем, что мы используем Bash.
Из руководства Bash ...
Вам нужно использовать один из других механизмов выхода из строки "или \
В этом нет ничего волшебного
alias
что требует использования одинарных кавычек.Оба следующие работают в bash.
Последний использует \ для экранирования символа пробела.
В # 111111 нет ничего волшебного, что требует одинарных кавычек.
Следующие опции достигают того же результата, что и другие две опции, в том смысле, что псевдоним rxvt работает как положено.
Вы также можете избежать неприятностей # напрямую
источник
В данном примере просто использовали двойные кавычки вместо одинарных кавычек в качестве внешнего escape-механизма:
Этот подход подходит для многих случаев, когда вы просто хотите передать фиксированную строку в команду: просто проверьте, как оболочка будет интерпретировать строку в двойных кавычках через
echo
, и при необходимости экранировать символы обратной косой чертой.В этом примере вы увидите, что двойных кавычек достаточно для защиты строки:
источник
Очевидно, что было бы проще просто заключить в двойные кавычки, но где в этом проблема? Вот ответ, используя только одинарные кавычки. Я использую переменную вместо того,
alias
чтобы ее было легче распечатать для доказательства, но это то же самое, что и использоватьalias
.объяснение
Ключ в том, что вы можете закрыть одинарную кавычку и открыть ее столько раз, сколько захотите. Например так
foo='a''b'
же, какfoo='ab'
. Таким образом, вы можете закрыть одинарную кавычку, добавить буквальную одинарную кавычку\'
, а затем снова открыть следующую одинарную кавычку.Диаграмма пробоя
Эта диаграмма проясняет использование скобок, чтобы показать, где одинарные кавычки открываются и закрываются. Кавычки не являются «вложенными», как круглые скобки. Также можно обратить внимание на цветовую подсветку, которая правильно применяется. Строки в кавычках - бордовые, тогда как
\'
черные.(По сути, это тот же ответ, что и у Адриана, но я чувствую, что это объясняет это лучше. Кроме того, его ответ содержит 2 лишних одинарных кавычки в конце.)
источник
'\''
метода, который я рекомендую, за'"'"'
метод, который людям труднее читать.Вот разработка «Единого верного ответа», на которую мы ссылаемся выше:
Иногда я буду скачивать с помощью rsync через ssh, и мне придется экранировать имя файла с '' ДВАЖДЫ! (OMG!) Один раз для Bash и один раз для SSH. Тот же принцип чередования разделителей цитат работает здесь.
Например, допустим, мы хотим получить: «Истории Лос-Анджелеса Теру» ...
И вот! Вы заканчиваете с этим:
что очень много работы для одного маленького »- но вы идете
источник
Объяснение реализации:
двойные кавычки, чтобы мы могли легко выводить перенос одинарных кавычек и использовать
${...}
синтаксисПоиск и замена bash выглядит так:
${varname//search/replacement}
мы заменяем
'
на'\''
'\''
кодирует один,'
например, так:'
заканчивает одинарное цитирование\'
кодирует'
(обратная косая черта необходима, потому что мы не внутри кавычек)'
снова запускается одинарное цитированиеbash автоматически объединяет строки без пробелов между
есть
\
перед каждым\
и'
потому что это правила выхода${...//.../...}
.PS Всегда кодируйте строки в одинарных кавычках, потому что они проще, чем строки в двойных кавычках.
источник
Другой способ решить проблему слишком большого количества слоев вложенной цитаты:
Вы пытаетесь втиснуть слишком много в слишком маленькое пространство, поэтому используйте функцию bash.
Проблема в том, что вы пытаетесь использовать слишком много уровней вложенности, а базовая технология псевдонимов недостаточно мощна, чтобы приспособиться. Используйте функцию bash, подобную этой, чтобы сделать так, чтобы одинарные, двойные кавычки возвращали тики и передавали параметры, все обрабатывались нормально, как мы и ожидали:
Затем вы можете использовать переменные $ 1 и $ 2, а также одинарные, двойные кавычки и обратные тики, не беспокоясь о том, что функция псевдонима нарушит их целостность.
Эта программа печатает:
источник
Если у вас установлен GNU Parallel, вы можете использовать его внутреннее цитирование:
С версии 20190222 вы можете даже
--shellquote
несколько раз:Он будет указывать строку во всех поддерживаемых оболочках (не только
bash
).источник
Эта функция:
позволяет цитировать
'
внутри'
. Используйте как это:Если строка для кавычек становится более сложной, например, двойные кавычки, смешанные с одинарными кавычками, может оказаться довольно сложно заставить строку заключать в кавычки внутри переменной. Когда такие случаи появляются, напишите точную строку, которую вам нужно процитировать внутри скрипта (похоже на это).
Будет выводить:
Все правильно цитируемые строки внутри одинарных кавычек.
источник
Если вы генерируете строку оболочки в Python 2 или Python 3, следующее может помочь процитировать аргументы:
Это выведет:
источник
Вот мои два цента - в случае, если кто-то хочет быть
sh
-портативным, а не простоbash
-специфичным (хотя решение не слишком эффективно, поскольку оно запускает внешнюю программу -sed
):quote.sh
(или простоquote
) где-нибудь на вашемPATH
:Пример:
И, конечно же, это преобразует обратно:
Объяснение: в основном мы должны заключить входные данные в кавычки
'
, а затем также заменить любую одиночную кавычку внутри этого микро-монстра:'"'"'
(завершите вводную кавычку парным соединением'
, экранируйте найденную одинарную кавычку, заключив ее в двойные кавычки -"'"
, и затем , наконец , выпустить новый открывающий апостроф'
, или в псевдо-обозначениях:' + "'" + ' == '"'"'
)Один из стандартных способов сделать это - использовать
sed
следующую команду подстановки:Одна небольшая проблема заключается в том, что для использования этого в оболочке необходимо экранировать все эти символы одинарных кавычек в самом выражении sed - что приводит к чему-то вроде
(И один хороший способ построить этот результат - передать исходное выражение
s/\(['][']*\)/'"\1"'/g
сценариям Кайла Роуза или Джорджа В. Рейли).Наконец, имеет смысл ожидать, что входные данные будут поступать
stdin
- поскольку передача его через аргументы командной строки может быть уже слишком большой проблемой.(О, и может быть, мы хотим добавить небольшое справочное сообщение, чтобы скрипт не зависал, когда кто-то просто запускает его,
./quote.sh --help
задаваясь вопросом, что он делает.)источник
Вот еще одно решение. Эта функция будет принимать один аргумент и соответствующим образом заключать его в кавычки, используя символ одинарных кавычек, так же, как объясняется в ответе с голосованием выше:
Итак, вы можете использовать это так:
источник