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
со строкой 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? ".
Несмотря на то, что вы можете использовать более простое и независимое решение (, используя только 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
. В таком случае вы хотите использовать =
вместо =~
.
Также обратите внимание, что $(...)
предпочтительнее, чем обратные кавычки.
Одинарные кавычки предотвращают замену $1. Поэкспериментируйте с цитированием частей этого утверждения, чтобы получить желаемые результаты.