Я хочу сделать что-то вроде bzr commit -m "It works!"
Я могу избежать восклицательного знака, выполнив bzr commit -m "It works\!"
Тем не менее, мое сообщение о фиксации содержит обратную косую черту. Как мне избежать восклицательного знака, игнорируя при этом обратную косую черту?
5 ответов
Вот другой метод, если вы хотите двойные кавычки, а также восклицательный знак:
echo "It's broken"'!'
Это работает, даже если !
не в конце строки.
Например:
echo "hello there"'!'" and goodbye"
Бонус: аналогичная техника может быть использована для экранирования любого текста в Sh или Bash (с помощью sed): см. Первый вариант в этом ответе. Кроме того, если у вас установлен bash-completion
, у вас, вероятно, уже есть функция quote()
.
Поскольку вы не зависите от bash для расширения переменных в сообщении фиксации, вы можете вместо этого использовать одинарные кавычки. Строки в одинарных кавычках не раскрываются с помощью bash.
bzr commit -m 'This does work!'
Отключить расширение истории:
set +H
или же
set +o histexpand
Вы можете добавить одну из этих команд в ваш ~/.bashrc
если вы обычно не используете расширение истории.
В Bash 4.3 добавлен особый случай:
символ раскрытия истории также рассматривается как заключенный в кавычки, если он непосредственно предшествует закрывающей двойной кавычке в строке в двойных кавычках
Используйте одинарные кавычки (') вместо двойных кавычек ("). Одинарные кавычки отключают всю интерпретацию материала в них, в то время как двойные кавычки отключают только некоторые.
bzr commit -m 'It works!'
Я только сейчас нашел еще один способ, который будет по крайней мере , работой с echo
строк Инг (предложениями) , который вы хотите перемежать с восклицательным знаком. Он выполняет более или менее конечный прогон вокруг своей вершины Bash и занимает немного больше времени для кодирования.
Гексекс для восклицательного знака, как указано на http://www.ascii-code.com/, равен 21, поэтому, если вы поставите \x21
в конце вашей строки, echo -e $foo
, сделайте $foo
его собственным расширенное echo [т.е. foo=$(echo -e "$foo")
], то, что вы получите, когда снова echo $foo
это строка с !
в конце. И никакого переключения его оси тоже нет.
Работает наверняка в Bash 4+. Более ранние версии, ymmv.