Термин «автоматизация задач» несколько широк. Многие типичные задачи системного администратора могут храниться в очень простых сценариях оболочки или отдельных командах, где «настоящий» язык был бы слишком высокоуровневым, чтобы быть практичным. Отсюда и происходит название «скорлупа» -вы удобно сидите внутри нее, но и попадаете в ловушку. Не существует оболочки 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.
Я согласен, если это означает :прежде чем писать сценарий, вы должны решить:
Должно совпасть.
Если нет :, то вы занимаетесь своим языком или изучаете новую тему на другом языке.
Эффект обратной косой черты в части регулярного выражения [[ 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
Обратите внимание, что в оболочке символы, заключенные в кавычки , на самом деле помечены специально , поэтому любая последующая обработка синтаксическим анализатором может основываться на решениях о том, заключена ли часть строки в кавычки или нет. без кавычек.