변수를 기반으로 x개 항목을 포함하는 메뉴 만들기

변수를 기반으로 x개 항목을 포함하는 메뉴 만들기

변수를 기반으로 x 행이 포함된 메뉴를 얻으려고 합니다.

설정:

x개의 IP 주소를 가진 네트워크가 있습니다

사용자가 숫자를 입력하여 간단히 IP 주소를 선택할 수 있는 메뉴를 제공하고 싶습니다.

예를 들어:

IP 주소가 4개 있습니다.

ip1=192.168.1.1
ip2=192.168.1.2
ip3=192.168.1.3
ip4=192.168.1.4

사용자가 이런 메뉴를 얻길 원합니다

1. 192.168.1.1
2. 192.168.1.2
3. 192.168.1.3
4. 192.168.1.4
Please enter your choice:

그러나 IP 주소의 수는 다를 수 있습니다.

나는 다음과 같은 경우에 이것을 하려고 합니다:

echo -n "Please enter your choice: "
read opt
case $opt in
    ipnum=ip$opt

    1)  echo ${!ipnum}
esac

하지만 루프에 들어갈 수는 없습니다.

답변1

bash(또는 유사한 쉘)을 사용하는 경우 :

ipnums=( 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4 )

select ip in "${ipnums[@]}"; do
    case $ip in
        "") echo 'Invalid choice' >&2 ;;
        *)  break
    esac
done

printf 'You picked IP %s\n' "$ip"

아래와 같이 메뉴와 프롬프트가 표시됩니다.

1) 192.168.1.1
2) 192.168.1.2
3) 192.168.1.3
4) 192.168.1.4
#? 

PS3사용할 프롬프트 문자열을 설정하여 프롬프트를 변경할 수 있습니다.

select루프는 입력의 유효성을 검사하고 사용자로부터 유효한 입력을 얻을 때까지 반복합니다.

주기가 끝나면 선택한 IP 주소를 에서 사용할 수 있습니다 $ip.

주소를 배열에 저장하고 싶지 않다면 관련 변수를 나열해야 합니다. (이것은 N 변수로 쉽게 일반화되지 않으므로 내 대답에 배열을 사용하도록 제안했습니다.다른 질문):

select ip in "$ip1" "$ip2" "$ip3" "$ip4"; do ...; done

답변2

제 경우에는 알아냈습니다.

@fra-san이 말했듯이 단순히 인쇄하고 사용자에게 선택하도록 요청하는 대신 케이스를 사용하는 이유는 무엇입니까?

방금 배열을 사용하여 모든 IP 주소 지정을 반영하고 앞에 추가 숫자를 추가했습니다. 숫자를 입력하면 변수의 숫자와 일치하므로 답을 얻었습니다.

관련 정보