На этот вопрос уже есть ответ здесь:
Есть ли простое правило, чтобы понять, когда использовать кавычки в командной строке Ubuntu, а когда одинарные кавычки и когда нужны двойные кавычки?
Например, как объяснить разницу здесь:
$ echo $'a\naa\nac\nb\ncc\tdd\ne\se'
a
aa
ac
b
cc dd
e\se
$
и
$ echo $"a\naa\nac\nb\ncc\tdd\ne\se"
a\naa\nac\nb\ncc\tdd\ne\se
$
В Вашем случае существует специальный используемый синтаксис заключения в кавычки, а именно, $'...'
и $"..."
. Похоже, что этот синтаксис прибыл от оболочки Korn до Zsh и Bash, и находится теперь в POSIX (см., например, "разворачивают последовательности" строка в http://mywiki.wooledge.org/Bashism). Этот синтаксис не упоминается в ответах на Различия между doublequotes "", singlequotes '' и обратными галочками ´´ на командной строке?.
Детали об этом синтаксисе могут быть найдены в ударе (1) страница справочника:
Words of the form $'string' are treated specially. The word
expands to string, with backslash-escaped characters replaced as specified
by the ANSI C standard. Backslash escape sequences, if present, are
decoded as follows:
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\' single quote
\" double quote
\nnn the eight-bit character whose value is the octal value
nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadecimal
value HH (one or two hex digits)
\uHHHH the Unicode (ISO/IEC 10646) character whose value is
the hexadecimal value HHHH (one to four hex digits)
\UHHHHHHHH
the Unicode (ISO/IEC 10646) character whose value is the
hexadecimal value HHHHHHHH (one to eight hex digits)
\cx a control-x character
The expanded result is single-quoted, as if the dollar sign had not
been present.
A double-quoted string preceded by a dollar sign ($"string") will
cause the string to be translated according to the current locale. If
the current locale is C or POSIX, the dollar sign is ignored. If the
string is translated and replaced, the replacement is double-quoted.
Это также означает, что переменная будет расширена в $"..."
, но не в $'...'
. Сравните:
$ echo 'I am using\t$SHELL.\n'
I am using\t$SHELL.\n
$ echo $'I am using\t$SHELL.\n'
I am using $SHELL.
$ echo "I am using\t$SHELL.\n"
I am using\t/bin/bash.\n
$ echo $"I am using\t$SHELL.\n"
I am using\t/bin/bash.\n
В первом примере, ни один $SHELL
переменная, ни Escape обратной косой черты расширены. Во втором примере примеры обратной косой черты расширены, но не переменная. Третьи и четвертые примеры дают идентичные результаты: Только переменная расширена.
Форма $'...'
может быть полезным для присвоения содержания с метасимволами как \t
или \n
к переменным. Я не мог найти применение для формы $"..."
,все же.
Обычно, двойные кавычки (" ") используются для печати, значение любых переменных и одинарных кавычек используется для печати точной строки.
, Например, у Вас есть переменная foo
, который содержит pwd
как значение.
foo=pwd
теперь, когда Вы делаете эхо:-
echo `$foo
`
распечатает Ваш текущий каталог, т.е. вывод pwd
команда. Проверьте принятый ответ в Различия между doublequotes " " singlequotes ' ' и обратные галочки ´ ´ на командной строке?
, Например, цель, полагайте, что переменное нечто содержит uname.
echo "$foo" outputs uname, subtitute variables in text.
echo '$foo' outputs $foo, the exact string (only ' should be escaped \').
echo `$foo` outputs Linux, execute the content of the variable and echo outputs it.
Вот также немного хорошие Руководства Командной строки
$ echo $'a\naa\nac\nb\ncc\tdd\ne\se'
a
aa
ac
b
cc dd
e\se
$
В вышеупомянутом примере, \n
представляет новую строку. Для этого Синтаксиса $'code\ncode1'
, терминал сначала печатает code
на первой строке и на следующей строке, это печатает code1
.
Таким образом в примере, терминал сначала начинает, выполняет code.prints a
на 1-й строке затем это перемещается в следующий символ. Следующий символ \n
который представляет новую строку. Таким образом, это печатает aa
в новой строке. И интерпретатор удара выполняется как этот. При наблюдении этого кода cc\tdd
, это печатает cc
и после некоторого пространства, это печатает dd
.Because \t
представляет tab
.Next это печатает e\se
asusual, потому что нет никакого значения для \s
.
$ echo $"a\naa\nac\nb\ncc\tdd\ne\se" a\naa\nac\nb\ncc\tdd\ne\se $
echo $"text"
.In это команда эха отображает любой данный внутри $""
как он как. Это не проанализирует.
echo $'code'
- Это анализирует код.
echo $"code"
- Если код содержит долларовую переменную, он должен быть расширен иначе, он не будет для \n \t и печатает все другое содержание как есть.