예기치 않은 EOF 및 구문 오류


9

현재 세 번째 쉘 스크립트를 작성 중이며 문제가 발생했습니다. 이것은 지금까지 내 스크립트입니다.

#!/bin/bash
echo "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script"

while read  
do  
 case in  
        1) who;;  
        2) ls -a;;  
        3) cal;;  
        4) exit;;  
 esac    
done

스크립트를 실행하려고하면 다음과 같이 표시됩니다.

line2 : unexpected EOF while looking for matching '"'  
line14 : syntax error: unexpected end of file.    

내가 무엇을 잘못하고 있지?


1
"ECF"가 아니라 "EOF"를 의미합니까?
l0b0

답변:


5

문제는 당신의 case진술에 평가할 변수 인 제목이 없다는 것입니다. 따라서 다음과 같은 것을 원할 것입니다.

#!/bin/bash
cat <<EOD
choose one of the following options:
1) display all current users
2) list all files
3) show calendar
4) exit script
EOD

while true; do
    printf "your choice: "
    read
    case $REPLY in
        1) who;;
        2) ls -a;;
        3) cal;;
        4) exit;;
    esac    
done

여기 case에는 변수 이름이 주어지지 않을 때 채우는 기본 변수 $REPLY가 사용 read됩니다 (자세한 내용 help read은 참조).

또한 변경 사항을 참고하십시오 : printf각 라운드에서 프롬프트를 표시하는 데 사용되며 줄 바꿈을 추가하지 않으며 cat여러 줄에 지시 사항을 인쇄 하여 줄 바꿈 하지 않고 읽기 쉽도록합니다.


6

잊지 말자 select:

choices=( 
    "display all current users" 
    "list all files" 
    "show calendar" 
    "exit script"
)
PS3="your choice: "
select choice in "${choices[@]}"; do
    case $choice in
        "${choices[0]}") who;;
        "${choices[1]}") ls -a;;
        "${choices[2]}") cal;;
        "${choices[3]}") break;;
    esac
done

1
이것은 지금까지 가장 깨끗한 답변처럼 보입니다. OP에 필요한 것을 정확하게 수행하도록 설계된 select를 사용합니다. 배열을 선택하면 이와 같은 데이터를 처리하고 스크립트의 다른 곳에서 사용할 수 있습니다. 종료하지 않고 중단을 사용하므로이 부분이 완료된 후 스크립트가 다른 작업을 수행 할 수 있습니다.
Joe

2

처음에는 단일 사례를 시도해 봅시다. I가 사용 read -p변수에 사용자 입력을 읽고 opt다음과 같은 경우 문 하였다.

#!/bin/bash
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt
case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac

위의 스크립트는 정상적으로 작동하므로 사용자가 옵션 4를 누를 때까지 사용자 입력을 읽을 수 있도록 루프에 있어야한다고 생각합니다.

그래서 우리는 while아래와 같이 루프로 할 수 있습니다. 변수 opt를 초기 값으로 0으로 설정했습니다. 이제 변수 에 값이 0 인 한 while루프 에서 반복하고 있습니다 opt(이것이 명령문 opt의 끝에서 변수를 0으로 재설정하는 이유입니다 case).

#!/bin/bash
opt=0;
while [ "$opt" == 0 ]
do
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt

case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac
opt=0
done

0

나는 코드의 시작 부분에 개인적으로 "while"을 넣을 것이다. 그런 다음을 사용 :하면 원하는만큼 반복 할 수 있습니다. 이것이 내가 쓰는 방법입니다.

while :
do
    echo "choose one of the following options : \
      1) display all current users \
      2) list all files \
      3) show calendar \
      4) exit script"
    read string
    case $string in
        1)
            who
            ;;

그런 다음 질문을 계속하고

esac
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.