동적 메뉴를 생성하고 사용 가능하게 만드는 방법은 무엇입니까?

동적 메뉴를 생성하고 사용 가능하게 만드는 방법은 무엇입니까?

특정 폴더에 저장된 파일 이름으로 메뉴를 생성한 다음 파일에 할당된 번호를 입력한 후 cat을 사용하여 파일 내용을 인쇄할 수 있는 스크립트를 만들려고 합니다. 내가 만든 루프는 메뉴 생성에는 잘 작동하지만 변수를 자동으로 설정하고 이를 사용하여 파일 내용을 인쇄하거나 케이스 구조를 생성하는 방법을 모르겠습니다(이 경우 어떤 접근 방식이 더 나은지 확실하지 않음). 내 루프는 다음과 같습니다

number=1
for file in ./menus/*; do
  echo "$number)" `basename -s .sh "$file"`
  let "number += 1"
done

답변1

그에 대한 dialog...

apt-get install dialog

예:

#!/bin/bash

HEIGHT=15
WIDTH=40
CHOICE_HEIGHT=4
BACKTITLE="Backtitle here"
TITLE="Title here"
MENU="Choose one of the following options:"

OPTIONS=(1 "Option 1"
         2 "Option 2"
         3 "Option 3")

CHOICE=$(dialog --clear \
                --backtitle "$BACKTITLE" \
                --title "$TITLE" \
                --menu "$MENU" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

clear
case $CHOICE in
        1)
            echo "You chose Option 1"
            ;;
        2)
            echo "You chose Option 2"
            ;;
        3)
            echo "You chose Option 3"
            ;;
esac

답변2

복잡한 case/if 문 대신 배열을 사용하여 파일 이름을 저장한 다음 배열 인덱스를 사용하여 필요한 파일을 호출할 수 있습니다.

number=1
for file in ./menus/*; do
fnames+=($(basename -s .sh $file))
#OR just fnames+=( $file )
echo "$number)" `basename -s .sh "$file"`
let "number += 1"
done
read -p "select a file id" fid
fid=$(($fid-1)) # reduce user input by 1 since array starts counting from zero
cat "${fnames[$fid]}.sh" # or just cat "${fnames[$fid]}" 

아래와 같이 Yad(Zenity의 고급 포크)를 사용하여 아름다운 GUI를 사용하여 작업을 완료할 수도 있습니다.
이 경우 숫자가 필요하지 않습니다. GUI 목록에서 파일을 선택하고 Enter를 누르거나 확인을 클릭하면 선택한 파일을 캡처하고 새 야드 창에서 해당 내용을 볼 수 있습니다.

Bash에서 한 줄 명령으로(테스트용):

fc=$(basename -s .sh $(find . -name "*.sh") |yad --list --width=500 --height=500 --center --column="File" --separator="") && cat $fc.sh |yad --text-info --width=800 --height=300

스크립트로:

yadb=0
while [ $yadb -eq "0" ];do 
    fc=$(basename -s .sh $(find . -name "*.sh") |yad --list --width=500 --height=500 --center --column="File" --separator="")
    yadb=$?
    if [ $yadb -eq "0" ]; then 
       cat $fc.sh |yad --text-info --width=800 --height=300
    fi
    # If you press cancel on yad window , then yadb will become 1 , file will not be displayed and while loop will be ended.
done

관련 정보