2013-02-27 5 views
2

아래 스크립트에서 출력이 msg_y and msg_z이 될 것으로 예상하고 있습니다. 하지만 인쇄는 msg_x and msg_z입니다. 누군가 무슨 일이 일어나는지 나에게 설명해 줄 수 있니?bash 쉘 스크립트에서 예기치 않은 결과가 출력됩니다.

#!/bin/bash 
set -x 

vr=2 
echo $vr 
if [ $vr > 5 ] 
then 
     echo "entered 1st if" 
     echo "msg_x" 

     echo "out of 1st if" 

     if [ $vr < 8 ]; then 
     echo "in of 2nd if" 
     echo "msg_y" 

     else 
     echo "msg_z" 
     fi 

else 
     if [ $vr > 1 ]; then echo "msg_y" 

     else echo "msg_z" 
     fi 
fi 

답변

6

이 표현

[ $vr > 5 ] 

출력 재로서 해석되고; 지금 "5"라는 파일이 있는지 확인하십시오. 출력 리디렉션은 사실적으로 사실입니다. 테스트 표현식 안의 매개 변수를 인용하는 일반적인 권고는 도움이되지 않는다는 것을 유의하십시오 (그러나 여전히 좋은 생각입니다). 이 테스트 명령의 연산자로 볼 수 있도록

당신은 >을 피할 수 있습니다

if [ "$vr" \> 5 ]; then 

또는 bash을 사용하고 있기 때문에 당신은 정수 비교 연산자 -gt

if [ "$vr" -gt 5 ]; then. 

을 사용할 수 있습니다 , 더 튼튼한을 사용할 수 있습니다. 조건식

if [[ $vr > 5 ]]; then 

또는

if [[ $vr -gt 5 ]]; then 

또는 (다른 사람에 대한 마찬가지로) 당신의 comparisions을 수행하는 연산 식을

if ((vr > 5)); then 

를 사용합니다.


참고 : 나는 정수로 둘러싸인 경우에도 비교 연산자로 > 일을 만드는 방법을 보여하지만,이 작업을 수행하지 않습니다. 인수는 수치 적으로는 아니 어 사전 식으로 비교되기 때문에 대부분의 경우 원하는 결과를 얻지 못합니다. 시도하십시오 [ 2 \> 10 ] && echo What? 올바른 정수 비교 연산자 (-gt 그 외)를 사용하거나 산술 식을 사용하십시오.

+0

그런 확실한 답변! – TopGunCoder

+0

이렇게 많은 가능한 해결책! :) – chepner

+0

그것은 아주 명확한 설명입니다. 고맙습니다. 예 "5"라는 파일이 생성되었습니다. – itsh

관련 문제