아래 if else 문에 어떤 문제가 있는지 이해할 수 없습니다.
if [ "$technology" == "AN_EUD" ] then
if [ "$temporal_unit" == "15min" ] && [ "$regional_unit" == "node" ]
then
parm="DEVICEID"
elif [ "$temporal_unit" == "15min" ] && [ "$regional_unit" == "trunk" ]
then
parm="DEVICEID"
else echo "Unkown parameter"
fi
else [ "$technology" == "IP" ] then
if [ "$temporal_unit" == "15min" ] && [ "$regional_unit" == "item" ]
then
parm="ME_NAME"
elif [ "$temporal_unit" == "min" ] && [ "$regional_unit" == "item" ]
then
parm="DEST"
else echo "Unknown parameter"
fi
fi
지속적으로 오류 미만
my.sh: line 67: syntax error near unexpected token `else'
my.sh: line 67: ` else [ "$technology" == "IP" ] then'
답변1
if [ "$technology" == "AN_EUD" ] then
^
거기에 세미콜론이 빠졌네요. 작성된 방식은 쉘 키워드가 아닌 명령에 대한 일반적인 인수 then
입니다 . [
(다시 말하지만, 이는 명령의 키워드가 아닙니다 echo if then else fi
.)
Bash는 후자가 else
여전히 찾고 있기 때문에 예상치 못한 토큰이고 명령의 시작 부분에 있기 then
때문에 불평합니다.else
예키워드로 식별됩니다. 하지만 문법적이지는 않습니다.
Shellcheck.net또한 "'then' 앞에 세미콜론이나 개행 문자를 사용하십시오(또는 리터럴로 만들려면 따옴표를 사용하십시오)"라고 되어 있습니다.
수리 후 모습은 이렇습니다.
else [ "$technology" == "IP" ] then
그래야 elif
하지만 그렇지 않습니다 else
. 앞에 세미콜론이 없으면 쉘 구문에 관한 한 이는 실제로 괜찮습니다 then
. 명령 [ "$technology" == "IP" ] then
은 else 블록의 일부일 뿐입니다. 테스트는 마지막 인수가 [
표시될 것으로 예상 ]
하지만 블록의 나머지 부분은 실행되므로 작동하지 않습니다. 세미콜론을 추가하고 그대로 두면 else
'예기치 않은 키워드' 오류가 발생합니다 then
.
테스트의 또 다른 문제는 ==
Bash 및 ksh에서는 작동하지만 표준이 아니라는 것입니다. 표준 비교 연산자 [ .. ]
는 입니다 =
.
(나는 여러분이 실제로 무엇을 하고 있는지 보지 않고 단지 구문과 오류만 보고 있다는 점에 유의하십시오.)
답변2
@ilkkachu가 코드 문제를 자세히 설명했습니다., 나는 단지 그것을 선언함으로써 더 간결하게 만들 수 있다는 점을 지적하고 있을 뿐입니다 case
. 여기서 세 변수는 단순히 함께 연결되며 문자열은 알려진 대소문자와 일치합니다.
case "$technology:$temporal_unit:$regional_unit" in
(AN_EUD:15min:node | AN_EUD:15min:trunk)
parm=DEVICEID;;
(IP:15min:item)
parm=ME_NAME;;
(IP:min:item)
parm=DEST;;
(*)
echo >&2 Unknown parameter;;
esac
패턴이 고정되어 있으므로 변수의 콜론은 구분 기호로 사용되는 콜론과 혼합될 수 없습니다.
if
/ 기반 문의 한 가지 차이점은 or가 아니면 fi
오류도 인쇄된다는 것입니다. 이것이 원하는 것이 아니라면 코드를 조정해야 할 수도 있습니다.$technology
IP
AN_EUD