1

Наличие простых команд эха:

echo "\n"

а также

echo "\\n"

оба результата дают одинаковый результат

\n

Может кто-нибудь объяснить мне подробно, как bash обрабатывает такие команды (char за char) и почему результат одинаков в обоих случаях?

2 ответа2

1

Короткий ответ: \ не всегда является особенным для bash или echo . Двойные кавычки сохраняют буквальное строковое значение всего внутри, кроме $ , ` , \ , а иногда и ! , Вне двойных кавычек, \ всегда особенный для bash: он сохраняет буквальное строковое значение следующего символа. Внутри кавычек обратная косая черта \ является специальной, если за ней следует один из пяти символов: $ , ` , " , \ или символ новой строки. В первых четырех случаях он сохраняет буквальное строковое значение следующего символа. Для bash версии echo \ никогда не бывает особенным, если не указан флаг -e .

Итак, в ваших двух случаях, что происходит:

echo "\n"

в этом случае \ не сопровождается ни одним из пяти упомянутых символов, и поэтому обрабатывается как его буквальное строковое значение.

echo "\\n"

в этом случае за первым \ следует второй \ . Первое экранирует второе, поэтому оно интерпретируется как его буквальное строковое значение. Это бесполезно, так как в любом случае оно будет интерпретироваться как его буквальное строковое значение, но это может быть полезно, если вы хотите напечатать одну обратную косую черту в конце строки, как в:

echo "This is a single backslash:\\"

поскольку в противном случае обратная косая черта будет интерпретироваться оболочкой как выходящая " .

Всю эту информацию можно почерпнуть из части справочной страницы bash о двойных кавычках, которую можно найти здесь.

0

Одиночный \ сохраняет буквальное строковое значение символа сразу после него.

Итак, в этом случае:

echo "\\n"

Первый \ сохраняет строковый литерал \ который находится перед "n" . Если бы вы набрали следующее ...

echo "\"

... вам нужно завершить команду, так как интерпретатор не увидит "\" как строковый литерал, а вместо этого будет ожидать ввода пользователя, чтобы избежать "следующего" символа.

Однако, если символ \ включен в одинарные кавычки, тогда не ожидается никакого escape-символа, так как одиночные кавычки сами по себе не сохраняют литеральные символы, которые они заключают.

Так, например: echo '\'

Это напечатало бы обратную косую черту как строковый литерал, а не как escape-символ, так что интерпретатор не будет ждать, пока пользователь включит символ.

Эта информация и многое другое включено в справочную страницу bash.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .