2016-10-15 1 views
0

이것은 잠재적으로 어리석은 질문이거나 불가능한 요청입니다. 어쨌든, 나는 설치된 소프트웨어 목록에서 선택된 프로그램을 시작하기위한 작은 스크립트를 작성하고있다. 기본적으로 스크립트는 번호가 매겨진 목록을 보여 주며 프로그램 목록은 사전 순으로 나열되어 있으며 실행하려는 프로그램에 해당하는 번호를 입력합니다. 내 선택 항목이 저장되는 변수는 case으로 보내지며 해당 소프트웨어가 실행되고 각 사례의 명령 목록에 위치가 저장됩니다. 보시다시피변수가 자동 증가하는 연속적인 경우

i=1 
echo -e "Which program to launch?\n"$((i++))". Program 1\n"$((i++))". Program 2\n" 
read choice 
case $choice in 
     1) path to program 1 
     2) path to program 2 
esac 

echo에 나는 새로운 프로그램이 나열 될 때마다 증가됩니다 변수를 사용했습니다. 새 프로그램을 설치할 때마다 수동으로 고정 숫자를 쓰지 않아도되도록 두 개의 기존 프로그램 사이에 목록에 삽입해야합니다. 내가해야 할 일은 보편적 인 $((i++)) 색인을 복사하면 목록이 스스로 조정됩니다.

문제는 내가 이것을 case 주기로 구현하는 방법을 모른다는 것입니다. 나는 순으로 기존의 두 사람 사이에 넣을 수있는 프로그램 (3)를 설치 echo을 가정 할 것은 내가 수동으로 3)에 두 번째 프로그램 전에 2)을 변경해야,이 방법

echo -e "Which program to launch?\n"$((i++))". Program 1\n"$((i++))". Program 3\n"$((i++))". Program 2\n" 

그러나 case에서

수정됩니다 .

case $choice in 
     1) path to program 1 
     2) path to program 3 
     3) path to program 2 
esac 

이 자신의 예에서 문제가되지 않을 수 있지만, 그것이 내가 프로그램의 수십을 가지고, 나는보다 더 때까지 등 7로, 6으로 6 5를 변경해야 할 것을 지금 20.

case 번호 매기기를 자동화하여 변수 값이 n 인 경우주기가 n 번째 경우를 실행해야한다는 것을 사이클이 이해할 수 있도록하려면 어떻게해야합니까?

#!/bin/bash 
declare -A choices=(
    [show files]=ls 
    [show date]=date 
    [list root dir]='ls /' 
) 
select choice in "${!choices[@]}" exit ; do 
    [[ $choice == exit ]] && break 
    ${choices[$choice]} 
done 

exit가 처리됩니다 : 당신은 당신이 실행하는 것과 다른 무언가를 제시 할 경우

#!/bin/bash 
select choice in ls date 'ls /' ; do 
    $choice 
    break 
done 

, 당신은 연관 배열을 사용할 수 있습니다

답변

2

배쉬는 이미 당신이 필요 않는 select있다 associative array의 outsice는 마지막으로 유지하려고하지만 연관 배열은 정렬되지 않습니다.

+0

이 방법은 각 선택에 대해 완전히 다른 명령을 제공 할 수 있습니까? 아니면 다른 명령을 만들기 위해 변수'$ choice' 자체에 의존해야합니까? –

+0

@JeffreyLebowski : 업데이트를 확인하십시오. – choroba

+1

업데이트에 대한 한 가지 의견 : 연관 배열의 단일 명령 * 이름 *보다 복잡한 것은 저장하지 마십시오. 더 복잡한 것은 이름을 배열에 저장할 수있는 함수로 래핑되어야합니다. – chepner

관련 문제