Поиск…


Синтаксис

  • \ 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow