Bash
квотирование
Поиск…
Синтаксис
- \ C (любой символ, кроме новой строки)
- «все буквальные, кроме одинарных кавычек»; 'this:' \ '' - это одиночная цитата '
- $ 'only \\ and \' являются особыми; \ n = новая строка и т. д.
- "$ variable и другой текст; \" \\\ $ \ `являются специальными"
Новые строки и контрольные символы
Новая строка может быть включена в строку с одной строкой или с двойными кавычками. Обратите внимание, что обратная косая черта-новая строка не приводит к новой строке, разрыв строки игнорируется.
newline1='
'
newline2="
"
newline3=$'\n'
empty=\
echo "Line${newline1}break"
echo "Line${newline2}break"
echo "Line${newline3}break"
echo "No line break${empty} here"
Внутри строк долларовой котировки, обратная косая черта или обратная косая черта-восьмеричность могут использоваться для вставки управляющих символов, как и во многих других языках программирования.
echo $'Tab: [\t]'
echo $'Tab again: [\009]'
echo $'Form feed: [\f]'
echo $'Line\nbreak'
Двойные кавычки для замены переменных и команд
Переменные замены должны использоваться только в двойных кавычках.
calculation='2 * 3'
echo "$calculation" # prints 2 * 3
echo $calculation # prints 2, the list of files in the current directory, and 3
echo "$(($calculation))" # prints 6
Вне двойных кавычек, $var
принимает значение var
, разбивает его на части, разделенные пробелами, и интерпретирует каждую часть как шаблон glob (wildcard). Если вы не хотите этого поведения, всегда кладите $var
внутри двойных кавычек: "$var"
.
То же самое относится к подстановкам команд: "$(mycommand)"
- это вывод mycommand
, $(mycommand)
- результат split + glob на выходе.
echo "$var" # good
echo "$(mycommand)" # good
another=$var # also works, assignment is implicitly double-quoted
make -D THING=$var # BAD! This is not a bash assignment.
make -D THING="$var" # good
make -D "THING=$var" # also good
Командные подстановки получают свои собственные контексты цитирования. Запись произвольно вложенные замен легко , потому что синтаксический анализатор будет следить за глубину вложенности , а не жадность поиска первого "
символ Синтаксиса фломастер StackOverflow разбирает это неправильно, однако , например..:
echo "formatted text: $(printf "a + b = %04d" "${c}")" # “formatted text: a + b = 0000”
Переменные аргументы для подстановки команд должны быть также заключены в двойные кавычки внутри расширений:
echo "$(mycommand "$arg1" "$arg2")"
Цитирование литералов
Все примеры в этом абзаце распечатывают строку
!"#$&'()*;<=>? @[\]^`{|}~
Обратная косая черта цитирует следующий символ, т. Е. Следующий символ интерпретируется буквально. Единственным исключением является новая строка: backslash-newline расширяется до пустой строки.
echo \!\"\#\$\&\'\(\)\*\;\<\=\>\?\ \ \@\[\\\]\^\`\{\|\}\~
Весь текст между одинарными кавычками (форвардные кавычки '
, также известный как апостроф, печатается буквально. Даже обратная косая черта выступает сама по себе, и невозможно включить одну цитату; вместо этого вы можете остановить литеральную строку, включить буквенную одинарную цитату с обратной косой чертой и снова запустить литерала. Таким образом, 4-символьная последовательность '\''
эффективно позволяет включать одну кавычку в строковой литературе.
echo '!"#$&'\''()*;<=>? @[\]^`{|}~'
# ^^^^
Доллар-одиночная кавычка запускает строковый литерал $'…'
как и многие другие языки программирования, где обратная косая черта цитирует следующий символ.
echo $'!"#$&\'()*;<=>? @[\\]^`{|}~'
# ^^ ^^
Двойные кавычки "
разграничить пол-буквенные строки , где только символы "
\
$
и `
сохранить их особое значение. Этим символам нужна обратная косая черта перед ними (обратите внимание, что если обратная косая черта сопровождается каким-то другим символом, обратная косая черта остается). Двойные кавычки в основном полезны при включении переменной или подстановки команд.
echo "!\"#\$&'()*;<=>? @[\\]^\`{|}~"
# ^^ ^^ ^^
echo "!\"#\$&'()*;<=>? @[\]^\`{|}~"
# ^^ ^ ^^ \[ prints \[
Взаимодействуйте, будьте осторожны !
запускает расширение истории внутри двойных кавычек: "!oops"
ищет более старую команду, содержащую oops
; "\!oops"
не выполняет расширение истории, но сохраняет обратную косую черту. Это не происходит в сценариях.
Разница между двойной кавычкой и одиночной кавычкой
Двойная цена | Единая котировка |
---|---|
Позволяет изменять переменную | Предотвращает изменение переменной |
Позволяет расширение истории, если включено | Предотвращает расширение истории |
Позволяет заменить команду | Предотвращает подстановку команд |
* и @ могут иметь особое значение | * и @ всегда являются литералами |
Может содержать как одинарные, так и двойные кавычки | Одинарная кавычка не допускается внутри одной кавычки |
$ , ` , " , \ могут быть экранированы с \ чтобы предотвратить их особое значение | Все они являются литералами |
Свойства, которые являются общими для обоих:
- Предотвращает зависание
- Предотвращает разбиение слов
Примеры:
$ echo "!cat"
echo "cat file"
cat file
$ echo '!cat'
!cat
echo "\"'\""
"'"
$ a='var'
$ echo '$a'
$a
$ echo "$a"
var