LinuxForum.Fans
Тема

Сравнение переменной с множеством других (Bash)

Автор: Cewrio 12 сообщений 4482 просмотров
#300289

Есть переменная, ее необходимо сравнить с множеством других и выполнить код, если по результатам проверки, значение переменной совпадет с значением хотя бы одной из всех остальных. Как это сделать красиво без нагромождений?

#300291

Загнать переменные для сравнения в массив?

#300293
"Cewrio" написал:
Как это сделать красиво без нагромождений?

Если не очень много сравнений (до 10, к примеру), то использование конструкции case, если больше — массив.

#300294

#!/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" )

Выводится только "c = a/b". В чем ошибка?

#300295
Lupo Alberto написал:
[quote="Cewrio"] Как это сделать красиво без нагромождений?

Если не очень много сравнений (до 10, к примеру), то использование конструкции case, если больше — массив.[/quote]
Тогда пожалуй за массив сразу возьмусь.

#300297

#!/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" )

line 8: [: too many arguments
line 9: [: too many arguments
line 10: [: too many arguments

#300298
"Cewrio" написал:
line 8: [: too many arguments
line 9: [: too many arguments
line 10: [: too many arguments
text

#!/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" )
#300301

Основывался вот на этом:

http://www.open-life.org/blog/bash/281.html написал:
Вывести содержимое всего массива: $ echo ${arr[@]}

С вашим вариантом ошибки выдавать перестало, но сама конструкция "$a" = "${d[@]}" видимо не верна, т.к. не выводится вообще ничего.

#300302

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

#300314

если переменная не содержит пробелов, то можно что-то вроде этого соорудить:

text

case "ARRAY[*]"
  *${VAR}*) <что делать>;;
esac

но это не красиво и отчасти хак...

иначе только в цикле... красиво этот цикл будет завернуть в фунцию...

#300315

В bash не силён, но, может, как-то так:

text

#!/bin/bash

a=1 b=2 c=3 d=4

x=5

arr=( a b c d ) if [[ ${arr[$x]} ]] then echo 'Yes' else echo 'No' fi

#300317

[[ ${arr[$a]} ]] && ( ... )

Увы, не сработало. Но все равно спасибо, выглядит красиво.
Остановился на таком варианте (идея не моя):

text
[[ " ${d[*]} " =~ " $a " ]] && ( ... )

Сравниваются ip адреса

Войдите или зарегистрируйтесь, чтобы ответить.