이것은 잠재적으로 어리석은 질문이거나 불가능한 요청입니다. 어쨌든, 나는 설치된 소프트웨어 목록에서 선택된 프로그램을 시작하기위한 작은 스크립트를 작성하고있다. 기본적으로 스크립트는 번호가 매겨진 목록을 보여 주며 프로그램 목록은 사전 순으로 나열되어 있으며 실행하려는 프로그램에 해당하는 번호를 입력합니다. 내 선택 항목이 저장되는 변수는 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
, 당신은 연관 배열을 사용할 수 있습니다
이 방법은 각 선택에 대해 완전히 다른 명령을 제공 할 수 있습니까? 아니면 다른 명령을 만들기 위해 변수'$ choice' 자체에 의존해야합니까? –
@JeffreyLebowski : 업데이트를 확인하십시오. – choroba
업데이트에 대한 한 가지 의견 : 연관 배열의 단일 명령 * 이름 *보다 복잡한 것은 저장하지 마십시오. 더 복잡한 것은 이름을 배열에 저장할 수있는 함수로 래핑되어야합니다. – chepner