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

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

6 ответов

Решение

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

bzr commit -m 'This does work!' 

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

echo "It's broken"'!'

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

Например:

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

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

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

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 его собственное расширенное эхо [т.е. foo=$(echo -e "$foo")], что вы получаете, когда вы echo $foo снова строка с ! в конце. И никакого переключения его оси тоже нет.

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

Недавно я нашел другой способ сделать это.

Это общий способ заставить Bash выполнить экранирование за вас, поэтому он удобен в произвольных случаях.

Из этой статьи :

Введите строку Bash, начинающуюся с комментария #, затем запустите !:q на следующей строке, чтобы увидеть, что будет с правильным экранированием Bash.

      bash-3.2$ # This string 'has single' "and double" quotes and a $
bash-3.2$ !:q
'# This string '\''has single'\'' "and double" quotes and a $'
bash: # This string 'has single' "and double" quotes and a $: command not found

Вы также можете добавитьpмодификатор (так:!:q:pчтобы избежать ошибки «команда не найдена»)

Другие вопросы по тегам