2013-06-18 4 views
0

기본적으로 원격 서버에 연결하고 그 루트 디렉토리에서 라인 수를 계산하는 다음과 같은 매우 간단한 쉘 스크립트를 작성하려고합니다. &과 같은 출력이 출력됩니다 아래하지만이 조건이 항상 오류를주는 경우 :쉘 스크립트에서 조건이 제대로 작동하지 않는 경우

#!/bin/sh 
i=servername 
var1=$(ssh [email protected]$i -t "cd /;ls -l|wc -l" 2>/dev/null) 
echo $var1 #(gives me a number output e.g 28) 
if [ $var1 -gt 0 ] 
then 
echo "successfuly connected" 
else 
echo "failed to connect" 
fi 
+4

SO에 "급한"것은 부적절합니다. –

+0

bash ('#!/bin/bash')를 사용할 수 있다면 if 문을'if [[$ var1 -gt 0]]' – SheetJS

답변

1

것은 당신의 ssh 명령의 출력에서 ​​다른 (아마도 보이지 않는) 문자가있을 수 있습니다 :

integer expression expected

가 여기 내 코드입니다.

이 아닌 모든 숫자를 제거하기 위해 sed를 통해 그 출력을 전달하십시오 :

var1=$(ssh [email protected]$i -t "cd /;ls -l|wc -l" 2>/dev/null | sed -e 's/[^0-9]//g') 
+0

으로 대체하십시오 !! 대단히 감사합니다. – mak

-2

이 7.1.2.2에서 http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html에서이

if [ "$var1" > "0" ] 

모습처럼 작성해야합니다. 숫자 비교

전체 파일

#!/bin/sh 
i=servername 
var1=$(ssh [email protected]$i -t "ls -l|wc -l" 2>/dev/null) 
echo $var1 
if [ "$var1" > "0" ] 
then 
echo "successfuly connected" 
else 
echo "failed to connect" 
fi 

29 
successfuly connected 
+0

메신저 왜 downvoted 모르겠어요? – exussum

+1

인용 부호가 도움이되지 않으며 정수 비교를 인용해서는 안됩니다. 문자열 비교를 수행하는 경우에만 변수를 인용해야합니다. – mplf

+0

내가 제공 한 정확한 라인을 사용하여, 그의 것을 사용하면 에러가 표시됩니다. 그래서 그 명확하게 작동 – exussum

0

이이 실패한 이유 아무것도 하나가 var1에 할당되지 중이거나 var1에 추가 문자가 포함되어 있기 때문입니다 수 있습니다. wc은 이것에 대한 맹점이 있습니다. 특정 위치에 들여 쓰여진 모든 것을 인쇄합니다. 그래서 보통 제가하는 일은 awk를 통해 숫자를 얻는 것입니다.

시도 :

var1=$(ssh [email protected]$i -- "cd /; ls -l | wc -l | awk '{print $1}'") 
0

귀하의 데이터는 아마 뒤에 캐리지 리턴이 포함되어 있습니다. 내가 오류 재현 할 수 있습니다 :

$ /bin/sh 
sh-4.2$ var1=28 
sh-4.2$ [ $var1 -gt 0 ] 
sh-4.2$ [ $var1 -gt 0 ] && echo OK 
OK 
sh-4.2$ var1=28^M 
sh-4.2$ [ $var1 -gt 0 ] 
: integer expression expected 

^M 리터럴 캐리지 리턴입니다, 에게 Ctrl 키VCtrl 키m 충돌

데이터를 확인하려면 :

printf "%s" "$var1" | od -c 

을 @ Nate 또는 @ mplf의 조언을 사용하여 원치 않는 문자를 잘라냅니다.

관련 문제