Или обрисую задачу иначе - есть переменная, ее необходимо сравнить с множеством других и выполнить код, если по результатам проверки, значение переменной совпадет с значением хотя бы одной из всех остальных. Как это сделать красиво без нагромождений?
(в кавычки добавлены пробелы)
Так единственным условием, при котором это будет работать неправльно, будет наличие пробелов в элементах, а их в IP-адресоах не бывает.
Ваш же вариант, как вы и сказали, найдёт "2.168.0.1" в "192.168.0.12"
Или обрисую задачу иначе - есть переменная, ее необходимо сравнить с множеством других и выполнить код, если по результатам проверки, значение переменной совпадет с значением хотя бы одной из всех остальных.
в bash (не очень старом) есть ассоциативные массивы
$
drbatty@ksu:~$ declare -A a
drbatty@ksu:~$ a["123"]=yes
drbatty@ksu:~$ a["345"]=yes
drbatty@ksu:~$ a["678"]=no
drbatty@ksu:~$ echo ${a["123"]}
yes # 123 есть
drbatty@ksu:~$ echo ${a["xyz"]}
# xyz нету
drbatty@ksu:~$ echo ${a[@]}
no yes yes # список всех значений
drbatty@ksu:~$ echo ${!a[@]}
678 123 345 # список всех ключей
drbatty@ksu:~$
/dev/random
вас же просили "без нагромождения"? Зачем там регулярки?
Во-первых, то, что заключено в кавычки, в этой команде обрабатывается не как регулярка, а как обычная строка. Т.е. [[ "$a" =~ foo.*bar ]] будет искать строку, содержащую foo и bar (в этом порядке), а [[ "$a" =~ "foo.*bar" ]] - строку foo.*bar.
Во-вторых, что-то мне подсказывает, что под "нагромождением" топикстартер подразумевал лишнй код в скрипте, вроде цикла.
/dev/random
ну у вас цикл просто скрыт - вы, как я понимаю, решили записать все ip в одну строчку, а потом её последовательно сканировать. ИМХО имея в наличие ассоциативный массив, это можно сделать напрямую, и пусть проблемы решают создатели нашего интерпретатора (думаю они применили хеш-структуру, с асимптотой O(1), а не O(N) как у вас. Это имеет значение, а то опять начнутся крики Леннартов о том, что дескать "bash - тормозит")