Операторы сравнения Bash

Можно ли собрать "Правда или Ложь" из сравнения в bash? Без использования «если».

Пример (позвольте мне сделать на другом языке)

x = 1
y = 1
z = x == y 
print(z) #Returns true

Как это в bash, если это возможно?

Решено

x=1
y=1
[[ $x -eq $y ]] && z=true || z=false
echo $z #Returns true

Спасибо @Виктор и @рандомир


person acruma    schedule 12.02.2018    source источник


Ответы (2)


Вы можете просто использовать test без if:

x=1
y=1
[ $"{x}" -eq $"{y}" ] && echo "True" || echo "False"

Здесь, если x равно y, сработает логическое И (&&), и скрипт выдаст "True".

Если x не равно, logical OR (||`) работает, сценарий выводит "False".

Обновление по совету @randomir другие доступные решения:

(( $"x" == $"y" )) && echo True || echo False

Or:

[[ $"a" == $"y" ]] && echo True || echo False
person Viktor Khilin    schedule 12.02.2018
comment
Почему вы используете $"{x}" вместо "$x"? - person M. Becerra; 12.02.2018
comment
@ M.Becerra Это привычка. В этом случае нам не нужно {}, но это полезно, когда вы делаете что-то вроде этого в своем коде: echo "Just example ${filename}.tar.gz, чтобы bash знал, что моя переменная с именем filename, а не filename.tar.gz - person Viktor Khilin; 12.02.2018
comment
Поскольку ОП интересует решение bash, возможно, было бы целесообразно также упомянуть арифметический тест (( x == y )) && echo True || echo False. И [[ $x -eq $y ]], где цитирование не требуется. - person randomir; 12.02.2018
comment
Достигнуто Спасибо - person acruma; 12.02.2018

Когда вы сохранили true или false в переменной, вы можете использовать это в условных выражениях напрямую:

#!/bin/sh
X=1
Y=1
if test "$X" -eq "$Y"; then Z=true; else Z=false; fi

echo "Z is $Z"

# you can just use Z here
if "$Z"; then do_ something; fi

Не существует выражения, которое напрямую возвращает логическое значение, но вы, вероятно, могли бы обернуть if/else в функцию, если бы вы действительно этого хотели (не проверено):

#!/bin/sh
bool_eq() {
  if test "$1" -eq "$2"; then echo true; else echo false; fi
}

X=1
Y=1
Z="$(bool_eq "$X" "$Y")"

echo "Z is $Z"

# you can just use Z here
if "$Z"; then do_ something; fi
person ndim    schedule 12.02.2018