Вопрос о формате оператора if

Sé que esto es viejo, pero odio cuando me encuentro con la única publicación que menciona mi problema exacto y no hay respuestas, así que aquí está:

Me metí con esto durante unos 20 minutos antes de simplemente reiniciar firewalld, y después de que el firewall se reinició, los puertos se enumeraron usando --list -all

Entonces, odio ser este tipo, pero "apagarlo y volverlo a encender" parecía ser la solución aquí para mí.

0
26.06.2019, 00:41
3 ответа

Вы сопоставляете регулярное выражение 0со строкой echo "$1%2" | bc. Строка не содержит 0, поэтому берется ветвь else.

Чтобы проверить, является ли $1нечетным или четным, используйте вместо этого арифметический тест:

if (( $1 % 2 == 0 )); then
    echo even
else
    echo odd
fi

Бит ((... ))представляет собой арифметическую оценку. Он будет оценивать выражение внутри, и его значение будет результатом этого выражения. Затем оператор ifможет воздействовать на результат.

Чтобы использовать bcпо назначению:

if [ "$( printf '%s %% 2\n' "$1" | bc )" -eq 0 ]; then
    echo even
else
    echo odd
fi

То есть используйте замену команды (на $(...)бит ), чтобы вставить результат выполнения команды внутри него, затем сравните его с нулем, используя-eq(для арифметического сравнения ).

Если использование printfкажется забавным, используйте

if [ "$( echo "$1 % 2" | bc )" -eq 0 ]; then
    echo even
else
    echo odd
fi

, но см. " Почему printf лучше, чем echo? ".

3
28.01.2020, 02:22

Несмотря на то, что вы можете использовать более простое и независимое решение (, используя только bash, так как это тоже зависит от bc), ваша попытка была почти правильной; просто замените ' на`(обратную кавычку):

if [[ `echo "$1%2" | bc` =~ 0 ]]
then
        echo "Even"
else
        echo "Odd"
fi 

что ты пробовал:

'echo "$1%2" | bc'

что вы имели в виду:

`echo "$1%2" | bc`

С другой стороны, вы используете=~:

An additional binary operator, ‘=~’, is available, with the same precedence as ‘==’ and ‘!=’. When it is used, the string to the right of the operator is considered a POSIX extended regular expression and matched accordingly (as in regex3)).

Вероятно, это не то, что вам нужно, но в данном конкретном случае будет работать просто отлично:n%2независимо от того, какое натуральное число n, всегда даст вам 0или 1.1(когда числоodd)не соответствует регулярному выражению 0, так что вы в безопасности... но будьте осторожны :это может быть неправильно в другом случае :регулярное выражение 0будет соответствует 0, но 10, 707, 2.71828182845905или что-то еще с 0. В таком случае вы хотите использовать =вместо =~.

Также обратите внимание, что $(...)предпочтительнее, чем обратные кавычки.

0
28.01.2020, 02:22

Одинарные кавычки предотвращают замену $1. Поэкспериментируйте с цитированием частей этого утверждения, чтобы получить желаемые результаты.

0
28.01.2020, 02:22

Теги

Похожие вопросы