Сравнение между 3 значениями - PullRequest
1 голос
/ 05 марта 2020

В оболочке bash я должен определить, равны ли три значения друг другу

if [val1 == val2 == val3]; then
do something
else
do other
fi

Но, похоже, это не работает (слишком много аргументов) Где я делаю неправильно? Спасибо Массимо

Ответы [ 4 ]

2 голосов
/ 05 марта 2020

Просто потому, что мы можем сделать это более сложно:

declare -A a=( [a$var1]= [a$var2]= [a$var3]= )
if [[ "${#a[@]}" == 1 ]]; then echo equal; else echo not equal; fi
unset a

Идея состоит в том, чтобы создать ассоциативный массив a с парами ключ-значение. Выше значение всегда является пустой строкой, поэтому мы заботимся только о ключах. Клавиши в приведенном выше являются a$var1, a$var2 и a$var3. Если какой-либо из этих ключей идентичен, то это как если бы мы определили только один. Т.е.

 declare -A a ( [aa]= [ab]= [aa]= )

эквивалентно

 declare -A a ( [aa]= [ab]= )

Значение ${#a[@]} возвращает общее количество записей в массиве. Таким образом, если оно равно единице, это означает, что все значения идентичны.

Мы ставим перед ключами символ (здесь a), чтобы гарантировать, что переменные могут быть чем угодно, включая пустые строки, @ и *. Спасибо Ивану за указание на это.

2 голосов
/ 05 марта 2020

Вам просто нужно сделать два сравнения.

if [ "$val1" = "$val2" ] && [ "$val2" = "$val3" ]; then
do something
else
do other
fi

Это использует тот факт, что все отношения эквивалентности транзитивны: если val1 = val2 и val2 = val3, то val1 = val3 должно быть истинным как хорошо.

1 голос
/ 05 марта 2020

Давайте снова договоримся о 1 законе, если a=b И b=c, то это будет a=b=c. Учитывая это, попробуйте изменить ваше условие на (Кстати, я не думаю, что bash позволяет набирать a==b==c, если условия хотя Python разрешает, если я здесь прав):

if [[ "$val1" -eq "$val2" && "$val2" -eq "$val3" ]]
then
  do something
else
  do other
fi

Пример выполнения:

Допустим, у нас есть следующий скрипт с 3 значениями переменных:

$ cat script.bash
#!/bin/bash
val1="1"
val2="1"
val3="1"
if [[ "$val1" -eq "$val2" && "$val2" -eq "$val3" ]]
then
  echo "do something"
else
  echo "do other"
fi

Теперь, когда мы запустим его как:

$ ./script.bash
do something
0 голосов
/ 05 марта 2020

Если все значения являются цифрами, это может работать (не)

$ val1=1 val2=1 val3=1
$ ((val1==val2==val3)) && echo ok || echo fail
ok

$ val1=1 val2=2 val3=1
$ ((val1==val2==val3)) && echo ok || echo fail
fail

Тогда вот так

$ val1=3 val2=3 val3=3
$ [[ "$val1 $val1" == "$val2 $val3" ]] && echo ok || echo fail
ok

$ val1=3 val2=3 val3=a2
$ [[ "$val1 $val1" == "$val2 $val3" ]] && echo ok || echo fail
fail

$ val1=asdlkjm2354l val2=$val1 val3=$val1
$ [[ "$val1 $val1" == "$val2 $val3" ]] && echo ok || echo fail
ok

$ val1=asdlkjm2354l val2=$val1 val3='sdf;lkjsdfs235lk;4j25'
$ [[ "$val1 $val1" == "$val2 $val3" ]] && echo ok || echo fail
fail

С (()) также работает

$ val1=3 val2=3 val3=3
$ (($val1$val1==$val2$val3)) && echo ok || echo fail
ok

$ val1=33 val2=3 val3=33
$ (($val1$val1==$val2$val3)) && echo ok || echo fail
fail
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...