bash if оператор со строками всегда оценивается как true - PullRequest
0 голосов
/ 16 ноября 2018

Я начинаю с bash и у меня проблемы с утверждениями if. Почему следующий скрипт:

#!/bin/bash
read C
if  (( $C == 'Y' )) ; then
    echo "YES"
elif (( $C == 'N' )) ; then
    echo "NO"
fi

Кажется, для печати YES независимо от того, какое значение $C принимает.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вот правильный формат.

#!/bin/bash
read C
if  [[ $C == 'Y' ]]
then
    echo "YES"
elif [[ $C == 'N' ]]
then
    echo "NO"
fi
0 голосов
/ 16 ноября 2018

Строки внутри арифметического оператора ((...)) рекурсивно раскрываются до тех пор, пока вы не получите целочисленное значение (включая 0 для неопределенного параметра) или строку, вызывающую синтаксическую ошибку.Некоторые примеры:

# x expands to y, and y expands to 3
$ x=y y=3
$ (( x == 3 )) && echo true
true

$ x="foo bar"
$ (( x == 3 ))
bash: ((: foo bar: syntax error in expression (error token is "bar")

# An undefined parameter expands to 0
$ unset x
$ (( x == 0 )) && echo true
true

В вашем случае $C расширяется до некоторого неопределенного имени параметра, и оно, и Y расширяются до 0, а 0 == 0.

Длядля сравнения строк используйте [[ ... ]].

if [[ $C == Y ]]; then
0 голосов
/ 16 ноября 2018

Да, как уже упоминалось @larsks, вам нужны квадратные скобки.Попробуйте эту полную версию:

#!/bin/bash

read C
if [[ ${C} == 'Y' ]]; then
    echo "YES"
elif [[ ${C} == 'N' ]]; then
    echo "NO"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...