
Команда echo $(echo \\\z)
откнига
, я не понимаю, почему он выводит
\з
Я думаю, что это должно вывести
з
решение1
\
— оператор кавычек для оболочки. Когда находится вне других видов кавычек, \x
то имеет вид 'x'
(за исключением случаев, когда x
это символ новой строки).
Так:
echo \\\x
как:
echo '\''x'
Или
echo '\x'
So echo
вызывается с двумя аргументами, один из которых содержит echo
(его имя), а другой — \x
.
Согласно POSIX, поведение, echo
когда любой из его операндов (аргументы, отличные от имени команды) содержит обратную косую черту или его первый операнд -n
не определен. Вы обнаружите, что поведение меняется даже за пределами этого.
Согласно спецификации UNIX (с применением XSI по ссылке выше), поведение echo '\z'
также не определено, поскольку \z
не является одной из стандартных управляющих последовательностей.
Однако с помощью UNIX-совместимого echo
, например echo
встроенного bash -o posix -O xpg_echo
, вы можете быть уверены, что:
echo '\\z'
такой же как:
echo \\\\z
или:
echo \\\\\z
выведет \z<newline>
.
Помимо этого, вы не получите никаких гарантий от POSIX.
Реализация может выводить z
или \z
или no such escape sequence: \z
или символ NUL...
Однако на практике я не знаю ни одной реализации, которая понимала бы это \z
как escape-последовательность, поэтому я обнаружил, что все те, которые я пробовал, выводят \z<newline>
именно так.
Если вам нужен портативный и надежный способ вывода текста,не используйте echo
, используйте printf
вместо этого.
решение2
Разделить эхо-заявку на разделы
\ — это переменная, которую bash распознает как escape
Поэтому \ экранирует символ "\", поэтому печатает \
\z экранирует символ "z", поэтому печатает z
Взятые вместе, мы имеем \z