172

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

5 ответов5

147

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

echo "It's broken"'!'

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

Например:

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

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

146

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

bzr commit -m 'This does work!' 
65

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

set +H

или же

set +o histexpand

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

В Bash 4.3 добавлен особый случай:

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

12

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

bzr commit -m 'It works!'
4

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

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

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

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