Опять же стоит отметить, что "'$i"
является лучшим решением для этой конкретной проблемы: '
может быть вложен как есть, и в том числе ссылки на переменную $i
внутри двойные кавычками защищает свое значение от потенциально нежелательных word-splitting and filename expansion (globbing).
POSIX-подобные оболочки не обеспечивают способ вставлять одиночные кавычки внутри одинарных кавычках строки - даже не вытекания. Следовательно, \
в '\'
просто рассматривается как литерал (см. Ниже обходной путь).
В остальном этом ответе показаны все подходы к выдаче буква '
, как внутри, так и снаружи, строки, указанные в кавычках.
Чтобы создать одиночную кавычку вне из строки в кавычках, просто используйте \'
:
$ echo I am 6\' tall.
I am 6' tall.
This кавычки (побег) только индивидуальный характер '
, используя \
. Но учтите, что токены, помещенные вне контекста строки с одним или двумя кавычками в командной строке, подчиняются word-splitting and filename expansion (globbing).
Чтобы использовать апостроф внутри двойных кавычках строки, использовать его как есть (не миновать требуется):
$ echo "I am 6' tall."
I am 6' tall.
Это лучший выбор, если вы хотите для вставки ссылок переменных (например, $i
) или команд (через подстановки команд, $(...)
) в вашу строку (вы можете подавить интерполяцию путем экранирования $
как \$
).
Чтобы использовать апостроф Внутри одинарными кавычками строка (в которой нет интерполяции (дополнения) не выполняется в соответствии с проектом), вы должны использовать обходной:
$ echo 'I am 6'\'' tall.'
I am 6' tall.
Обходное решение необходимо с помощью однокабельных строк, не поддерживающих встроенные одинарные котировки вообще; '\''
часть имеет смысл только «внутри» одинарных кавычках в том, что:
- ведущий
'
завершает одинарных кавычках до сих пор
\'
затем производит '
буквальным индивидуально отделался \
за пределами контекст цитируемой строки.
- конечный
'
затем «перезапускает» оставшуюся часть строки с одной кавычкой.
Другими словами: В то время как вы не можете напрямую вставлять апостроф, вы можете разбить одинарных кавычках на несколько частей, вставить индивидуально \
убежал '
экземпляры вне в одинарных кавычках, как это необходимо, и пусть конкатенация строки Bash (которая автоматически присоединяется непосредственно к соседней строке) объедините ее все вместе, чтобы сформировать одну строку.
chepner точек в комментарии, что вы можете в качестве альтернативы используют here-document с цитируемого открытия разделителем, который действует как одинарных кавычках строки, позволяя вложение '
символов:
read -r var <<'EOF' # quoted delimiter -> like a '...' string, but ' can be embedded
I am 6' tall.
EOF
С неупомянутый открывающий разделитель, здесь-документ действует как двойных кавычках строки, которая, так же как и последний, также позволяет встраивание '
, а также поддерживает расширения:
read -r var <<EOF # unquoted delimiter -> like a "..." string
$USER is 6' tall.
EOF
Наконец, если остальные POSIX- совместимый не является обязательным, вы можете использовать строку ANSI C-quoted string, которая позволяет встраивать одинарные кавычки с \'
;
отмечают, что такие строки интерпретировать управляющие последовательности управления символьные, такие как \n
, но в остальном, как обычный одинарных кавычках строки, не выполняют интерполяцию переменных ссылок или подстановки команд:
$ echo $'I am 6\' tall.'
I am 6' tall.
Используйте [\ [shellcheck \ ]] (http://shellcheck.net) – sjsam
@tripleee: Пока [связанный вопрос] (http://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-variable?noredirect= 1 & lq = 1), как правило, связаны друг с другом, ни он, ни его ответы не адресуют _embedding_ одиночные кавычки внутри (одиночные кавычки) строки или не генерируют одиночные одиночные кавычки, которые находятся в центре внимания этого вопроса. – mklement0
@ mklement0 На самом деле, http://stackoverflow.com/a/27701642/874188 предлагает использовать двойные кавычки вокруг одинарных кавычек, когда вам нужна буквальная одинарная кавычка. Но я в порядке, оставив этот вопрос открытым. (Для контекста для будущих читателей я ранее отмечал это как дубликат, но он был возвращен.) – tripleee