bash: элементарные if-условия не работают? (сравнение строк) - PullRequest
1 голос
/ 14 марта 2019

Когда я запускаю этот скрипт в bash:

#!/bin/bash

str="no"

if [ "$str"="yes" ]; then
    echo "condition 1 is true"
fi

if [ "$str"=="yes" ]; then
    echo "condition 2 is true"
fi

if [[ "$str"="yes" ]]; then
    echo "condition 3 is true"
fi

if [[ "$str"=="yes" ]]; then
    echo "condition 4 is true"
fi

if (( "$str"="yes" )); then
    echo "condition 5 is true"
fi

if (( "$str"=="yes" )); then
    echo "condition 6 is true"
fi

К моему удивлению, я получаю:

условие 1 верно
условие 2 верно
условие 3 верно
условие 4 верно
условие 5 верно
условие 6 верно

Обратите внимание, что $str имеет значение no, а не yes.

Я не до конца понимаю разницу между = и == (по крайней мере, не в этом контексте bash, как я делаю на других языках) или между положением условия if одинарным [ ... ] или двойным [[ ... ]] или двойные (( ... )) скобки.

Однако я, очевидно, что-то здесь очень неправильно, но я не вижу этого?

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

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

[ "no=yes" ]

, который будет оцениваться как true (непустая строка).

[...] выполняет тестирование с использованием внешней тестовой команды [ (предположительно /bin/[), а [[...]] - встроенной проверки оболочки (например, bash или ksh).Для теста = и == имеют одинаковое значение.Что в случае встроенного теста ([[...]]) фактически оценивается на соответствие шаблону: т.е. [[ yeees == y*s ]] также верно.

((...)) - это арифметическая оценка.= - это задание, а == проверяет равенство.В моем случае (может привести к версии bash) # 5 на самом деле выдает false, если я заранее не установил yes=1 в качестве назначенного возвращаемого значения для оценки ... в этом случае новая переменная с именем no, поскольку именно это strуказал (решено) на.Для сравнения, это арифметическое сравнение вернет true, если значения обеих переменных равны ... что буквально означает (( no == yes )) или в синтаксисе теста [[ "$no" -eq "$yes" ]].Если ни no, ни yes не установлены, сравниваются два 0.

1 голос
/ 14 марта 2019

Вы должны разделить знаки равенства пробелами.Например:

#!/bin/bash

str="no"

if [ "$str" = "yes" ]; then
    echo "condition 1 is true"
fi

...

...