условное выражение bash и экранирование обратной косой черты

Термин «автоматизация задач» несколько широк. Многие типичные задачи системного администратора могут храниться в очень простых сценариях оболочки или отдельных командах, где «настоящий» язык был бы слишком высокоуровневым, чтобы быть практичным. Отсюда и происходит название «скорлупа» -вы удобно сидите внутри нее, но и попадаете в ловушку. Не существует оболочки perl или оболочки python -. Я даже не знаю, почему именно.

Оболочка (s )позволяет очень легко интегрировать другие интерпретаторы :шебанг для исполняемых файлов и явный вызов со строкой ("один вкладыш" )или файл ("именованный скрипт" ).

readability and testability vs conciseness and elegance

Все это можно использовать на любом языке в зависимости от конкретной проблемы . Вопрос не в (python vs. perl) vs. bash, а в том, каким «молотком» какой «гвоздь» использовать.

Из комментария:

Speed might be another concern, Python can be slow to start up...

Опять же, все зависит от конкретной задачи/алгоритма. Но скорость всегда вызывает беспокойство, потому что «безобидный» цикл может занять в 10 или 100 раз больше времени, если вы сделаете это просто так.

I'd say just use what you're comfortable with, and what gets the job done.

Я согласен, если это означает :прежде чем писать сценарий, вы должны решить:

  1. Как это сделать эффективно? (и портативный, и ремонтопригодный, и элегантный, и...)
  2. Какие инструменты мне нравится использовать? (У меня хорошо получается?)

Должно совпасть.

Если нет :, то вы занимаетесь своим языком или изучаете новую тему на другом языке.

2
29.10.2020, 20:41
1 ответ

Эффект обратной косой черты в части регулярного выражения [[ str =~ rex ]]состоит в том, чтобы заключать в кавычки следующий символ (точно так же, как если бы он был заключен в одинарные кавычки ), что указывает bash на выполнение буквальное соответствие для него (1 ). Поскольку bне является особым, \bпревратится просто в b, а '\', "\\"или \\превратятся в \\, чтобы соответствовать буквальному обратному слэшу :

.
[[ abwords =~ \bwords ]] && echo "<$BASH_REMATCH>"
<bwords>
[[ 'a\bwords' =~ \\bwords ]] && echo "<$BASH_REMATCH>"
<\bwords>
# conversely, '|' is just like \|
[[ 'a|words' =~ a'|'words ]] && echo "<$BASH_REMATCH>"
<a|words>

Ваша идея поместить регулярное выражение в переменную хороша. Альтернативой может быть использование функции-оболочки :

.
rematch() [[ $1 =~ $2 ]]

if rematch 'two words' '\bwords\b'; then
  echo "<$BASH_REMATCH>"
fi
<words>

(1 ):, как описано в его руководстве:

Any part of the pattern may be quoted to force the quoted portion to be matched as a string

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

2
18.03.2021, 22:54

Теги

Похожие вопросы