![쉘 스크립트: 구문 오류: ';;' 예기치 않음('fi'가 필요함)](https://linux55.com/image/173690/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%3A%20%EA%B5%AC%EB%AC%B8%20%EC%98%A4%EB%A5%98%3A%20'%3B%3B'%20%EC%98%88%EA%B8%B0%EC%B9%98%20%EC%95%8A%EC%9D%8C('fi'%EA%B0%80%20%ED%95%84%EC%9A%94%ED%95%A8).png)
나는 이것이 왜 실패하는지 평생 알 수 없습니다. 그래서 여기 누군가가 이것에 대해 밝힐 수 있기를 바랍니다.
#!/bin/sh
NAME=Container
if [ -d "/mnt/SSD/docker" ]; then
if [ ! -d "/mnt/SSD/docker/$NAME/data" ]; then
mkdir -p /mnt/SSD/docker/$NAME/data
fi
printf "\nPlease select installation method:\n\n"
while true; do
read -p "1. Re-create existing container
2. Create new container: " CHOICE
case $CHOICE in
1 )
if [ "$(docker ps -a | grep $NAME)" ]; then
IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $NAME)
MAC=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $NAME)
docker stop $NAME; docker rm $NAME; docker image rm repo/image
break;;
else
printf "\nNo existing container found, going back to menu!\n\n";;
fi
2 )
read -p 'Please enter the IP-address to use: ' IP
read -p 'Please enter the MAC-address to use: ' MAC
break;;
* )
printf "\nIncorrect or no selection made. Please enter 1 or 2.\n\n";;
esac
done
docker run -d \
-e JVM_HEAP=1024m -e TZ=Europe/Stockholm \
--hostname=$NAME \
--ip=$IP \
--mac-address=$MAC \
--name=$NAME --network=macvlan \
--restart=always \
-v /mnt/SSD/docker/$NAME/data:/$NAME/data \
-v /mnt/HDD/Storage:/mnt/HDD/Storage \
repo/image
else
logger "ZFS pool SSD is not mounted; aborting $0!"
fi
Binarysta의 답변을 통해 구문 오류가 발생했지만 이제 case 문에 break나 종료가 사용되지 않으므로 스크립트는 더 이상 해야 할 작업을 수행하지 않습니다.
Option 1. 컨테이너가 있으면(break;;) Case 문 다음에 명령어를 실행해야 하고, 컨테이너가 없으면 메뉴로 돌아가거나(;;) 스크립트를 종료(exit;;)한다.
;; 대신 break를 사용하면 무엇을 선택하더라도 명령이 실행되지만 ;;는 메뉴로 돌아가서 해당 명령이 실행되지 않습니다.
답변1
case
진술에 몇 가지 문법적 오류가 있습니다.
#!/bin/sh
NAME=Container
if [ -d "/mnt/SSD/docker" ]; then
if [ ! -d "/mnt/SSD/docker/$NAME/data" ]; then
mkdir -p /mnt/SSD/docker/$NAME/data
fi
printf "\nPlease select installation method:\n\n"
while true; do
read -p "1. Re-create existing container
2. Create new container: " CHOICE
case $CHOICE in
1 )
if [ "$(docker ps -a | grep $NAME)" ]; then
IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $NAME)
MAC=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $NAME)
docker stop $NAME; docker rm $NAME; docker image rm repo/image
else
printf "\nNo existing container found, going back to menu!\n\n"
fi
;;
2 )
read -p 'Please enter the IP-address to use: ' IP
read -p 'Please enter the MAC-address to use: ' MAC
;;
* )
printf "\nIncorrect or no selection made. Please enter 1 or 2.\n\n"
;;
esac
done
docker run -d \
-e JVM_HEAP=1024m -e TZ=Europe/Stockholm \
--hostname=$NAME \
--ip=$IP \
--mac-address=$MAC \
--name=$NAME --network=macvlan \
--restart=always \
-v /mnt/SSD/docker/$NAME/data:/$NAME/data \
-v /mnt/HDD/Storage:/mnt/HDD/Storage \
repo/image
else
logger "ZFS pool SSD is not mounted; aborting $0!"
fi
답변2
스모키,;;사건 분리를 위한 것입니다. if 내부가 아닌 해당 수준에 있어야 합니다. 거기에 구문 오류가 있습니다. 따라서 케이스 끝에서 'break'를 수행하면(if 이후)
도움이 되길 바랍니다.
#!/bin/sh
NAME=Container
while true; do
read -p "1. Re-create existing container
2. Create new container: " CHOICE
case $CHOICE in
1 )
echo 1 gekozen
if [ "y" = "x" ]
then
echo x
else
echo stop
break
fi
;;
2 )
echo 2 gekozen
read -p 'Please enter the IP-address to use: ' IP
read -p 'Please enter the MAC-address to use: ' MAC
echo IP is $IP
echo MAC is $MAC
break;;
* )
printf "\nIncorrect or no selection made. Please enter 1 or 2.\n\n"
;;
esac
done