쉘의 조건이 작동하지 않으면 내가 무슨 실수를 하고 있는지 확실하지 않습니까? [복사]

쉘의 조건이 작동하지 않으면 내가 무슨 실수를 하고 있는지 확실하지 않습니까? [복사]

서버를 기반으로 특정 작업 세트를 수행해야 하므로 서버를 기반으로 조건을 정의하고 싶습니다. 이것은 제가 생각해낸 스크립트입니다. 여러 블로그를 읽었지만 스크립트에서 오류를 찾을 수 없습니다. 제가 여기서 간과하고 있는 부분을 안내해 주실 수 있나요?

#!/bin/bash
SERVER_NAME=`hostname -s`
hostname -s
DBServer=(servr1 servr2 servr3 servr4)
#AppServer=[hqidlfdiwa01 , hqiqlfdiwa01]
echo "Values of DBServer seeing is ${DBServer[*]}"
Values of DBServer seeing is servr1 servr2 servr3 servr4
for i in ${DBServer[*]}
do
  echo "current value in I is $i"
  echo "The server name found is $SERVER_NAME"
  if [$SERVER_NAME == $i]
  then
    echo "I am on one of the servers and it is $i"
  fi
done

서버에서 보는 출력은 다음과 같습니다.

current value in I is servr1
The server name found is servr1
-bash: [servr1: command not found
current value in I is servr2
The server name found is servr1
-bash: [servr1: command not found
current value in I is servr3
The server name found is servr1
-bash: [servr1: command not found
current value in I is servr4
The server name found is servr1
-bash: [servr1: command not found

답변1

쉘에서는 공간이 중요합니다.

바꾸다:

if [$SERVER_NAME == $i]

그리고:

if [ "$SERVER_NAME" = "$i" ]

공백이 없으면 셸은 인수 와 이라는 이름의 명령 [$SERVER_NAME(예: ) 을 실행한다고 가정합니다 . 이 공간을 사용하면 쉘이 실행될 수 있습니다.[servr1==$i]시험로 표현되는 명령 [.

또한 어떤 쉘 확장이 적용될지 모르고 특별히 적용하려는 경우가 아니면 항상 쉘 변수를 큰따옴표로 묶으십시오.

마지막으로 bash는 내부적으로 문자열 동일성을 허용 ==하거나 표현하지만 다른 쉘은 이를 이해하기만 합니다 . 이식성을 위해 내부적으로 문자열 같음을 사용하는 것이 가장 좋습니다 .=[...]==[...]

관련 정보