if 문의 형식에 대한 질문

if 문의 형식에 대한 질문

다음 코드는 내가 입력한 숫자에 관계없이 "홀수"를 인쇄하는데, 짝수를 인수로 제공하면 왜 "짝수"를 인쇄하지 않습니까?

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수 있습니다. 정규식은 , , , 또는 . 이 경우 대신 를 사용해야 합니다 .00107072.718281828459050==~

또한 $(...)백틱보다 낫다는 점에 유의하세요.

관련 정보