다음 코드는 내가 입력한 숫자에 관계없이 "홀수"를 인쇄하는데, 짝수를 인수로 제공하면 왜 "짝수"를 인쇄하지 않습니까?
if [[ 'echo "$1%2" | bc' =~ 0 ]]
then
echo "Even"
else
echo "Odd"
fi
답변1
정규식을 다음 0
과 결합하고 있습니다.끈 echo "$1%2" | bc
. 문자열에 a가 포함되어 있지 않으므로 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
즉, 명령대체(bit $(...)
)를 이용하여 명령을 실행한 결과를 대입한 후 -eq
(산술비교를 위해) 이를 사용하여 0과 비교한다.
printf
사용하는 것이 재미있다고 느끼면 사용하세요 .
if [ "$( echo "$1 % 2" | bc )" -eq 0 ]; then
echo even
else
echo odd
fi
하지만 봐주세요"왜 printf가 echo보다 나은가요?".
답변2
작은따옴표는 $1이 대체되는 것을 방지합니다. 원하는 결과를 얻으려면 문장의 일부를 인용해 보세요.
답변3
더 간단하고 독립적인 솔루션을 사용할 수 있지만 귀하의 시도는 거의 정확합니다 ( bash
그것도 의존하기 때문에 그냥 사용하십시오).bc
'~을 위한`(백틱):
if [[ `echo "$1%2" | bc` =~ 0 ]]
then
echo "Even"
else
echo "Odd"
fi
무엇을 시도해 보셨나요:
'echo "$1%2" | bc'
네 말 뜻은:
`echo "$1%2" | bc`
반면에 당신은=~
:
"==" 및 "!="와 우선순위가 동일한 추가 이항 연산자 "=~"를 사용할 수도 있습니다. 사용되면 연산자 오른쪽에 있는 문자열은 POSIX 확장 정규식으로 처리되고 그에 따라 일치됩니다(예: regex3).
아마, 이아니요당신이 원하는 것은, 그러나 이 특정한 경우에는 잘 작동할 것입니다: n%2
자연수가 무엇 n
이든 상관없이, 그것은 항상 당신에게 0
또는 을 줄 것입니다 1
. 1
(숫자가 odd
)은 정규식과 일치하지 않으므로 안전합니다... 그러나 참고: 다른 경우에는 이것이 틀릴 0
수 있습니다. 정규식은 , , , 또는 . 이 경우 대신 를 사용해야 합니다 .0
0
10
707
2.71828182845905
0
=
=~
또한 $(...)
백틱보다 낫다는 점에 유의하세요.