в соответствии сдокументация gnu,
Обратная косая черта сохраняет свое особое значение только в том случае, если за ней следует один из следующих символов: '$', '`', '"', '\' или новая строка. В двойных кавычках обратная косая черта, за которой следует один из этих символов, удаляется.
Я пытался
p="a\$b";echo $p # a$b
p="a\`b";echo $p # a`b
p="a\"b";echo $p # a"b
p="a\\b";echo $p # a\b
все ок. Но новая строка??
p="a\newlineb";echo $p # a\newlineb
Что означает новая строка в документе?
решение1
Newline — это название символа новой строки, т.е. символа, который \n
в языке C обычно записывается как:
$ p="a\
b"; echo "$p"
ab
Результатом является ab
то, что вместо\a<newline>b
того, чтобыСтандарт POSIX гласит::
A
<backslash>
, который не заключен в кавычки, сохраняет буквальное значение следующего символа, за исключением a<newline>
. Если a<newline>
следует за ,<backslash>
оболочка интерпретирует это как продолжение строки.<backslash>
and<newline>
должны быть удалены перед разделением ввода на токены. Поскольку экранированный символ<newline>
полностью удаляется из ввода и не заменяется никаким пробелом, он не может служить разделителем токенов.
Но строкаявляетсявзято в двойные кавычки... Ну, это особый случай:
Символ
<backslash>
сохраняет свое особое значение в качестве экранированного символа только в том случае, если за ним следует один из следующих символов, считающихся особыми:$
,`
,"
,\
,<newline>
.
Таким образом, строка в двойных кавычках означает, что обратная косая черта-новая строка интерпретируется так, как если бы она быланетвообще не заключено в кавычки, то есть действует как продолжение строки, а обратная косая черта и символ новой строки удаляются.
Обратите внимание, что это происходит в момент присвоения переменной p
значения, а не когда вы echo
ее используете.
Смотрите такжеПоследствия для безопасности, если забыть заключить переменную в кавычки в оболочках bash/POSIXо необходимости всегда заключать переменные в кавычки.