특정 폴더에 저장된 파일 이름으로 메뉴를 생성한 다음 파일에 할당된 번호를 입력한 후 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