변수가 쉘의 숫자와 같은지 테스트하는 방법


8

작동하지 않는이 쉘 스크립트가 있습니다.

입력:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi

산출:

Server Name is 1

그러나 내가 변경 Server_Name=2하면 출력은 다음과 같습니다.

Server Name is 1

로 변경 Server_Name하면 다음 2과 같이 말하고 싶습니다 Server Name is 2.

나는 그것이 그 if [ $Server_Name=1 ];부분 이라는 것을 안다 .

어떻게 고치나요?


David가 아래에서 지적한 것처럼 숫자 값을 테스트하려면 "-eq"를 사용해야합니다. 오류를 피하기 위해 빈 변수를 검사 할 수도 있습니다. if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock

답변:


16

스크립트는 문자열 비교를 사용하고 있음을 나타냅니다.

서버 이름이 숫자 대신 문자열 일 수 있다고 가정하십시오.

대한 문자열 비교 :
if [[ "$Server_Name" == 1 ]]; then

노트:

  • == 주위의 간격은 필수입니다
  • = 간격은 필수
    if [ $Server_Name=1 ]; then 입니다.

  • [[와]] 사이에 경로 이름 확장이나 단어 분리가 발생하지 않으므로 [[...]]로 오류를 줄입니다.

  • "단어"인 인용 문자열 선호

대한 정수 비교 :
if [[ "$Server_Name" -eq 1 ]]; then


더 많은 정보 :


2
[[bash는 구문은 다음과 영업 이익은 작동하지 않을 것입니다 쉘에 대해 질문했다
길 라드의 mayani


1
[ $Server_Name=1 ]

단일 괄호 안의 구문은 Bash에 특별하지 않기 때문에 의도 한대로 작동하지 않습니다. 평소와 같이 변수 $Server_Name는 1로 대체되므로 모든 test ( [) 명령이 보는 단일 인수 인 string 1=1입니다. 찌르는 길이가 0이 아니기 때문에 testtrue를 반환 합니다 .

POSIX 호환 쉘의 경우 다음 테스트 명령을 사용할 수 있습니다 .

[ "$Server_Name" = 1 ]

checks는 $Server_Name문자열과 같습니다 1.

[ "$Server_Name" -eq 1 ]

검사는이 $Server_Name받는 동일한 번호 1 는 숫자 비교 대신 문자열 비교를 수행, 즉.

예를 들어을 정의하면 두 명령의 반환 값이 달라집니다 Server_Name=01. 첫 번째는 false를 반환하고 두 번째는 true를 반환합니다.

변수 $Server_Name가 정의되지 않았을 가능성이있는 경우 인용 해야합니다. 그렇지 않으면 호출시 test 에서 오류가 표시됩니다.


1

시험,

 #!/bin/bash
 Server_Name=50
 if [ $Server_Name = 49 ]
 then
 echo "Server Name is 50"
 else
 echo "Server Name is below 50"
 fi

산출:

 #./scriptname.sh
 Server Name is below 50

0

간단한 대답. 귀하의 코드는 정확합니다. 당신이 누락 된 유일한 것은 공백입니다 ... (그리고 아마도 여분의 "=")

if [ $Server_Name=1 ]; then

올바르게 계산되지 않습니다.

if [ $Server_Name == 1 ]; then  

당신이 찾는 것입니다.

이제 문자열 대 숫자에 대한 설명. is / is-not과 같은 비교를 검색 할 때마다 ==는 항상 좋습니다.

그리고 항상 서버 이름을 숫자가 아닌 문자열로 가정합니다. ;-)

코딩 견습생에게 행운을 빕니다.

챠오


너무 많은 답변이 여기에 있습니다 ..
Tobibobi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.