본문 바로가기
System/Shell Script

[쉘 스크립트] select, while, until

by Yoonsoo Park 2024. 11. 18.

**해당 포스트는 Ubunto 22.04와 xShell을 기반으로 진행한 포스팅입니다. 

 

1. select 

: select는 사용자에게 옵션 목록을 제공하고, 선택을 입력받는데 사용된다. 간단한 인터페이스를 제공하는 스크립트를 작성할 때 주로 사용된다. 

// select문 기본 구조

PS3="최초 표시할 안내 문구"

select 변수 in 옵션1 옵션2 ...; do
	# 사용자 입력에 따라 실행할 명령
    break
done

** 쉘 스크립트에서 PS3는 select 문에서 사용자 입력을 받을 때 표시되는 프롬프트 메시지를 정의하는 데 사용

 

예제) select와 case를 적절히 사용하여, 구글, 네이버, 다음, 종료 옵션을 만들고, 번호를 입력하여 선택할 수 있게 하는 스크립트를 작성하라. 

#!/bin/bash

list=("구글" "네이버" "다음" "종료") # 옵션을 리스트로 설정

PS3="옵션 번호를 입력하세요: "  # select 문에서는 PS3를 이용해 사용자 입력을 받는다

select choice in "${list[@]}"; do  # 리스트의 모든 요소를 옵션으로 만든다
        case "$choice" in
                구글)
                        echo "구글 - www.google.com"
                        continue;;  # 루프 제어
                다음)
                        echo "다음 - www.daum.net"
                        continue;;
                네이버)
                        echo "네이버 - www.naver.com"
                        continue;;
                종료)
                        echo "종료합니다"
                        break;;  # 루프 제어
                *)  //*(와일드카드)를 사용하여 예외처리
                        echo "잘못된 입력입니다"
                        continue;;
        esac
done

echo "$REPLY" # PS3 프롬프트를 통해 입력 받은 값은 REPLY에 저장된다
//결과값

root@root:~/testdir# ./url.sh
1) 구글
2) 네이버
3) 다음
4) 종료
옵션 번호를 입력하세요: 1
구글 - www.google.com
옵션 번호를 입력하세요: 2
네이버 - www.naver.com
옵션 번호를 입력하세요: 3
다음 - www.daum.net
옵션 번호를 입력하세요: 4
종료합니다
4  # REPLY 환경 변수에 저장된 값

 

##루프(loop) 제어: continue, break##

continue : 반복문 전체를 중단하지는 않고, 특정 조건에서만 현재 루프의 나머지 부분을 건너뛴다. 전체적인 반복문은 다시 처음부터 실행한다. 

break : 조건이 만족되면 반복문 전체를 빠져나온다

 

 

2. while, until

: while조건이 참일 동안, until은 반대로 조건이 거짓일 동안 루프(반복)을 실행한다.

 

# while 의 기본 구조
while [조건]; done
	#조건이 참일 경우, 반복할 명령
do

# until의 기본 구조 
until [조건]; done
	#조건이 거짓일 경우, 반복할 명령
do

 

예제) 1~5까지 반복문을 사용하여 표시하는데, 3은 건너뛰는 반복문을 만들어라(while과 until을 각각 사용해서 작성해보자.

// while

#!/bin/bash

counter=0

while [ $counter -lt 5 ]; do
    counter=$((counter + 1))

    if [ $counter -eq 3 ]; then
        echo "값 $counter 건너뜁니다."
        continue
    fi

    if [ $counter -eq 5 ]; then
        echo "값 $counter에서 반복 종료."
        break
    fi

    echo "현재 값: $counter"
done
// until

#!/bin/bash

counter=0

until [ $counter -ge 5 ]; do
    counter=$((counter + 1))

    if [ $counter -eq 3 ]; then
        echo "값 $counter 건너뜁니다."
        continue
    fi

    if [ $counter -eq 5 ]; then
        echo "값 $counter에서 반복 종료."
        break
    fi

    echo "현재 값: $counter"
done

 

 

 힘들지만 오늘도 해낸 나를 위한 한 마디,

"들은 것은 잊어버리도, 본 것은 기억하고, 직접 해본 것은 이해한다", 공자

 

"가장 중요한 것은 두렵고 실패하더라도 직접 경험해보는 것이다. 그러니 주저하지 말고, 두려움을 떨치고, 직접 실천해보자"