it-swarm-ru.tech

В bash, как мне избежать восклицательного знака?

Я хочу сделать что-то вроде bzr commit -m "It works!". Я могу как-то избежать восклицательного знака, выполнив bzr commit -m "It works\!". Тем не менее, мое сообщение о фиксации содержит обратную косую черту. Как мне избежать восклицательного знака, игнорируя при этом обратную косую черту?

178
Matthew

Поскольку вы не зависите от bash для расширения переменных в сообщении фиксации, вы можете вместо этого использовать одинарные кавычки. Строки в одинарных кавычках не раскрываются с помощью bash.

bzr commit -m 'This does work!' 
149
Benjamin Bannier

Вот другой метод, если вы хотите двойные кавычки, а также восклицательный знак:

echo "It's broken"'!'

Это работает, даже если ! находится не в конце строки.

Например:

echo "hello there"'!'" and goodbye"

Бонус: аналогичная техника может использоваться для экранирования любого текста в Sh или Bash (с помощью sed): см. Первый вариант в этот ответ . Кроме того, если у вас установлен bash-completion, скорее всего, у вас уже есть функция quote() .

151
jwd

Отключить расширение истории :

set +H

или же

set +o histexpand

Вы можете добавить одну из этих команд в свой ~/.bashrc, если вы обычно не используете расширение истории.

Bash 4.3 добавил особый случай :

символ раскрытия истории также рассматривается как заключенный в кавычки, если он непосредственно предшествует закрывающей двойной кавычке в строке в двойных кавычках

65
Dennis Williamson

Используйте одинарные кавычки (') вместо двойных кавычек ("). Одинарные кавычки отключают всю интерпретацию содержимого в них, в то время как двойные кавычки отключают только некоторые.

bzr commit -m 'It works!'
12
KeithB

Я только что нашел другой способ, который будет по крайней мере работать со строками (предложениями) echoing, которые вы хотите акцентировать восклицательным знаком. Он выполняет более или менее конечный прогон вокруг своей вершины Bash и занимает чуть больше времени для кодирования.

Гекс для восклицательного знака, как указано в http://www.ascii-code.com/ , равен 21, поэтому, если вы поставите \x21 в конце вашей строки, echo -e $foo, сделайте $foo своим собственным расширенным эхо [т. е. foo=$(echo -e "$foo")], когда вы снова echo $foo, вы получаете строку с ! в конце. И никакого переключения его оси тоже нет.

Работает наверняка в Bash 4+. Более ранние версии, ymmv.

4
SilversleevesX