Сравнить переменную со всеми элементами массива сразу

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

CewrioR
Сообщения: 45

Сравнить переменную со всеми элементами массива сразу

Сообщение CewrioR »

#!/bin/bash
a=1
b=2
c=1
d=( $b $c )
e=( $a $c )
f=( $a $b )
[[ "$a" = "${d[@]}" ]] && ( echo "a = b/c" )
[[ "$b" = "${e[@]}" ]] && ( echo "b = a/c" )
[[ "$c" = "${f[@]}" ]] && ( echo "c = a/b" )

Ничего не выводит - в чем ошибка?
Спасибо сказали:
Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение Brainsburn »

Потому-что "1" != "2 1". Мне кажется, такой способ не работоспособен.
Спасибо сказали:
CewrioR
Сообщения: 45

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение CewrioR »

Как правильно сделать с помощью массива?

Или обрисую задачу иначе - есть переменная, ее необходимо сравнить с множеством других и выполнить код, если по результатам проверки, значение переменной совпадет с значением хотя бы одной из всех остальных. Как это сделать красиво без нагромождений?
Спасибо сказали:
Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение Brainsburn »

Попробуйте так:

Код: Выделить всё

[[ "${d[*]}" =~ "$a" ]] && ( echo "A = B/C" )


Впрочем, вру, тут оно "1" и в числе "11" обнаружит.
Спасибо сказали:
CewrioR
Сообщения: 45

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение CewrioR »

В переменных будут ip адреса - так то корректно все должно сработать. Спасибо
Спасибо сказали:
Аватара пользователя
Brainsburn
Сообщения: 950
Статус: /
ОС: Gentoo

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение Brainsburn »

Так-то да, но лучше проверить самому.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение /dev/random »

Brainsburn писал(а):
02.02.2013 18:14
Попробуйте так:

Код: Выделить всё

[[ "${d[*]}" =~ "$a" ]] && ( echo "A = B/C" )


Впрочем, вру, тут оно "1" и в числе "11" обнаружит.

Лучше так:

Код: Выделить всё

[[ " ${d[*]} " =~ " $a " ]] && ( echo "A = B/C" )

(в кавычки добавлены пробелы)
Так единственным условием, при котором это будет работать неправльно, будет наличие пробелов в элементах, а их в IP-адресоах не бывает.
Ваш же вариант, как вы и сказали, найдёт "2.168.0.1" в "192.168.0.12"
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение drBatty »

CewrioR писал(а):
02.02.2013 18:03
Или обрисую задачу иначе - есть переменная, ее необходимо сравнить с множеством других и выполнить код, если по результатам проверки, значение переменной совпадет с значением хотя бы одной из всех остальных.

в 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:~$

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение drBatty »

/dev/random
вас же просили "без нагромождения"? Зачем там регулярки?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение /dev/random »

drBatty писал(а):
05.02.2013 12:01
/dev/random
вас же просили "без нагромождения"? Зачем там регулярки?

Во-первых, то, что заключено в кавычки, в этой команде обрабатывается не как регулярка, а как обычная строка. Т.е. [[ "$a" =~ foo.*bar ]] будет искать строку, содержащую foo и bar (в этом порядке), а [[ "$a" =~ "foo.*bar" ]] - строку foo.*bar.
Во-вторых, что-то мне подсказывает, что под "нагромождением" топикстартер подразумевал лишнй код в скрипте, вроде цикла.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Сравнить переменную со всеми элементами массива сразу

Сообщение drBatty »

/dev/random
ну у вас цикл просто скрыт - вы, как я понимаю, решили записать все ip в одну строчку, а потом её последовательно сканировать. ИМХО имея в наличие ассоциативный массив, это можно сделать напрямую, и пусть проблемы решают создатели нашего интерпретатора (думаю они применили хеш-структуру, с асимптотой O(1), а не O(N) как у вас. Это имеет значение, а то опять начнутся крики Леннартов о том, что дескать "bash - тормозит")
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: