휩테일 메뉴에 배열 - BASH

휩테일 메뉴에 배열 - BASH

사용자 친화적인 메뉴를 표시하고 싶습니다 whiptail.

내 목표 whiptail는 다음과 같습니다

Choice1
Choice2
Choice3
Choice4

내 배열에는 다음이 포함됩니다.

Choice1 Choice2 Choice3 Choice4

다음과 같은 루프를 통해 배열을 실행하고 있습니다.

for value in ${value[@]}
do
    echo "$value"
done

whiptail메뉴가 4개 더 생겨서 내부 에코를 추가할 수 없습니다 .

나는 다음과 같은 스크립트를 시도했습니다.

$val=$(whiptail --title "xx" --menu "choose" 16 78 10
for value in ${value[@]}
do
    echo "$value"
done
3>&1 1>&2 2>&3)

위에서 언급한 스크립트를 실행한 후 내 쉘이 끔찍해 보입니다.

스크립트 후 쉘:

여기에 이미지 설명을 입력하세요.

누구든지 내 문제를 해결할 수 있나요?

답변1

스크립트에 몇 가지 오류가 있습니다. 예를 들어 루프 반복자에 배열 자체와 동일한 이름을 지정하면 안 됩니다. 그러나 이를 수행하기 위해 루프가 필요하지 않습니다. 특수 배열 인덱스를 사용하여 모든 배열 요소를 한 번에 넣기만 하면 됩니다 @.

value=(Choice1 "" Choice2 "" Choice3 "" Choice4 "")
whiptail --title "xx" --menu "choose" 16 78 10 "${value[@]}"

따옴표 안의 빈 문자열에 유의하세요 "". 이는 메뉴 옵션에 대한 필수 설명이며 , 이 문자열이 없으면 설명으로 처리 whiptail됩니다 .ChoiceChoice4

Choice1 Choice2
Choice3 Choice4

당신이 원하는 것이 아닐 수도 있습니다.

답변2

체크박스 메뉴가 필요한 경우:

checkboxes () 
{ 
    local -A checkboxes;
    checkboxes["foo"]=off;
    checkboxes["bar"]=on;
    checkboxes["eric"]=on;

    backtitle="Backtitle";
    title="Title";
    question="Please choose:";

    choices=();
    for key in "${!checkboxes[@]}";
    do
        choices+=("$key" "" "${checkboxes[$key]}");
    done;

    result=$(
        whiptail --backtitle "$backtitle" \
                 --title "$title"         \
                 --checklist "$text"      \
                 0 0 0 "${choices[@]}"    \
                 3>&2 2>&1 1>&3-
    );
    echo "$result"
}

관련 정보