LinuxForum.Fans
Тема

Обратные кавычки

Автор: Gorinich911 5 сообщений 3282 просмотров
#95750

Доброго времени суток!

Столкнулся со следующей проблемой при программировании скриптов в bash. Привожу только упрощенную команду по проблеме (в оригинале более сложные команды, команда echo приводится только в качестве примера). Мне непонятно, почему получаются различные результаты при использовании обратных кавычек:

text

echo `echo \\q`  # Получается q
echo `echo \\\q`  # Получается \q

При выполнении как команды echo как в первом, так и во втором случае, внутри обратных кавычек должно получаться \q. В обратных кавычках бэкслэш трактуется как литерал, за исключением тех случаев, когда после него идут `,$ и \.

Вроде, получаться должно одно и то же...

#95775

дык и без кавычек:
[console]doc@bx:~$ echo \q
q
doc@bx:~$ echo \\\q
\q
[/console]

потому-что \q значит "просто q", в силу того, что никакого спецсимвола не задано.
А вот \\ трактуется тоже как \, ну и так оно и получается.

Короче - бекслеш всегда срезается.

Что-бы добиться ожидаемого поведения, используйте опцию -e и двойные кавычки:
[console]doc@bx:~$ echo -e "XYZ\bABC"
XYABC
[/console]
Здесь печатается XYZ, потом спецсимвол \b затирает Z и на его месте печатает ABC
Однако, без кавычек, литерал \b попросту не попадёт внутрь echo, а будет обработан самим bash'ем.
[console]doc@bx:~$ echo -e XYZ\bABC
XYZbABC[/console]

#95784

Не совсем то, о чем я спрашивал. Меня интересует поведение результата внутренней команды echo внутри обратных кавычек.

С одним бэкслешем все понятно, но вот разница с двумя и тремя - нет.

text

echo \\q

и

text
 
echo \\\q 

дают одинаковый результат - \q
Вот только почему в обратных кавычках этот результат трактуется по-разному (версия bash - 3.2.48)
?

#195867
Gorinich911 написал:
дают одинаковый результат - \q

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

#196716

echo `echo \\\q` во втором echo эранирует 2 слэш и q и передет это первому echo так \\q
~$echo `echo \\\q`
\q

~$ echo \\q
\q


echo `echo \\q` во втором echo эранирует 2 слэш и передет это первому echo \q
~$ echo `echo \\q`
q

~$ echo \q
q

Поправте если не прав

Войдите или зарегистрируйтесь, чтобы ответить.