Bash 스크립트 메뉴 생성 및 디버그

Bash 스크립트 메뉴 생성 및 디버그

내 첫 번째 시도는 다른 게시물에서 언급한 것처럼 sh를 사용하는 것이었습니다.여기.

터미널에서만 실행되도록 bash 스크립트 메뉴를 실행하려고 합니다.

#!/bin/bash

HEIGHT=800
WIDTH=600
CHOICE_HEIGHT=8
BACKTITLE="Installer-menu"
TITLE="Setup opions"
MENU="Choose one of the following options:"

OPTIONS=$(1 Add Mint PPA and update 
          2 Install Cinnamon 
          3 update and upgrade 
          4 Additional software installation 
          5 Upgrade Kernel 
          6 Resolve Ubuntu Cinnamon issues 
          7 Install graphic proprietary driver
          x reboot )
    
RESULT=$(dialog --clear \
                --backtitle "$BACKTITLE" \
                --title "$TITLE" \
                --menu "$MENU" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

case $RESULT in
    1) sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com A1715D88E1DF1F24 40976EAF437D05B5 3B4FE6ACC0B21F32 A6616109451BBBF2;
       sudo sh -c 'echo "deb http://packages.linuxmint.com vanessa main upstream import backport romeo" >> /etc/apt/sources.list.d/mint.list';
       sudo sh -c 'echo "deb-src http://packages.linuxmint.com vanessa main upstream import backport romeo" >> /etc/apt/sources.list.d/mint.list';
       sudo apt-key export 451BBBF2 | gpg --dearmour -o /etc/apt/trusted.gpg.d/mint.gpg;
       sudo apt update;;
    2) sudo apt install slick-greeter muffin cinnamon;;
    3) sudo apt update;
       sudo apt upgrade -y;;
    4) sudo sh additional-software.sh;;
    5) sudo sh ubuntu-mainline-kernel.sh;;
    6) sudo sh problem-solver.sh;;
    7) sudo sh nvidia-installation;;
    *) reboot;;
esac

그리고 더 작은 것:

#!/bin/bash

HEIGHT=800
WIDTH=600
CHOICE_HEIGHT=8
BACKTITLE="Installer-menu"
TITLE="Package options"
MENU="Choose one of the following options:"

OPTIONS=$(1 Install package list 
          2 Export package list
          3 update and upgrade 
          x reboot )
    
RESULT=$(dialog --clear \
                --backtitle "$BACKTITLE" \
                --title "$TITLE" \
                --menu "$MENU" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

case $RESULT in
     1) while IFS= read -r line
do
  echo "apt install -y $line"
done < installation.txt;;
     2) awk -F'll ' '
  /apt install/ && !/nvidia/ && !/--/ && !/-f/{ print $2 }
' /var/log/apt/history.log >installation.txt;;
     3) sudo apt update && sudo apt upgrade;;
     *) reboot;;
esac

$ shellcheck myscript
No issues detected!

나는 두 가지 모두에서 같은 것을 간과하고 있다고 생각합니다. 두 파일 모두 마지막 명령만 실행합니다.

누군가 나를 깨달을 수 있습니까?

참조 사용

패키지를 실행할 수 있었던 모든 사람으로부터 도움을 받았습니다.(=bash 스크립트 파일 이름)메뉴에는 다음이 포함됩니다.

#!/bin/bash

width=72
height=22
menu_height=8
backtitle='Installer-menu'
title='Package options'
menu='Choose one of the following options:'

options=(1 'Install package list'
         2 'Export package list'
         3 'update and upgrade'
         x reboot
         q quit )

result=$(dialog --clear \
                --backtitle "$backtitle" \
                --title "$title" \
                --menu "$menu" \
                $height $width $menu_height \
                "${options[@]}" \
                2>&1 >/dev/tty)

case "$result" in
     1) echo Package Install;
        sh installpkgs.sh;;
     2) echo Manualy installed packages exported;
        sh pkgsexport.sh;;
     3) echo Package upgrade;
        apt update && apt upgrade -y;;
     x) echo Reboot;
        reboot;;
     q) clear; exit ;;
esac

이 두 sh 파일에는 다음이 포함됩니다.

#!/bin/sh
# Export manualy installed packages 
# Packages installed with apt install from terminal excl.
# Output file: installation.txt

awk -F'll ' '  /apt install/ && !/nvidia/ && !/--/ && !/-f/{ print $2 }  ' /var/log/apt/history.log >installation.txt

#!/bin/sh
# Install package list
for pkg in `cat installation.txt`; do sudo apt-get install -y $pkg; done

나열된 모든 옵션을 사용하여 작업 메뉴를 생성합니다. 패키지 bash 스크립트


설치 프로그램 메뉴의 경우 다음과 같이 적용해 보았습니다.

#!/bin/bash

width=72
height=22
menu_height=8
backtitle="Installer-menu"
title="Setup opions"
menu="Choose one of the following options:"

options=(1 Add Mint PPA and update 
         2 Install Cinnamon 
         3 update and upgrade 
         4 Additional software installation 
         5 Upgrade Kernel 
         6 Resolve Ubuntu Cinnamon issues 
         7 Install graphic proprietary driver
         x reboot
         q quit )
    
result=$(dialog --clear \
                --backtitle "$backtitle" \
                --title "$title" \
                --menu "$menu" \
                $height $width $menu_height \
                "${options[@]}" \
                2>&1 >/dev/tty)

case "$result" in
    1)  echo 'Mint backport repos installed';
        apt-key adv --recv-keys --keyserver keyserver.ubuntu.com A1715D88E1DF1F24 40976EAF437D05B5 3B4FE6ACC0B21F32 A6616109451BBBF2;
        sh -c 'echo "deb http://packages.linuxmint.com vanessa main upstream import backport romeo" >> /etc/apt/sources.list.d/mint.list';
        sh -c 'echo "deb-src http://packages.linuxmint.com vanessa main upstream import backport romeo" >> /etc/apt/sources.list.d/mint.list';
        apt-key export 451BBBF2 | gpg --dearmour -o /etc/apt/trusted.gpg.d/mint.gpg;
        apt update;;
    2)  echo 'Installation of Cinnamon';
        apt install slick-greeter muffin cinnamon;;
    3)  echo 'Package upgrade';
        apt update && apt upgrade -y;;
    4)  sh additional-software.sh;;
    5)  sh ubuntu-mainline-kernel.sh;;
    6)  sh problem-solver.sh;;
    7)  sh nvidia-installation;;
     x) echo Reboot;
        reboot;;
     q) clear; exit ;;
esac

메뉴는 다음과 같이 표시됩니다.

설치 프로그램 메뉴

하지만 사이에 각 제목을 입력하는 것을 잊어버렸습니다.' '

답변1

다음은 내가 의견에서 말하는 내용에 대한 (모의 실행, 에코 전용) 예입니다.

  1. 배열을 만드는 options=()대신 사용하세요 . options=$()배열 목록 및명령 대체같은 것이 아닙니다.
  2. 배열의 여러 단어 요소는 따옴표로 묶어야 합니다.
  3. 소문자 변수 이름.

반품:

  1. 높이와 너비가 dialog픽셀이 아닌 문자로 지정되므로 800x600 대신 72x22를 사용했습니다. 이는 "표준" 80x25 화면이나 터미널의 대부분을 채우기에 충분합니다. 아니면 둘 다 설정하여 메뉴를 원하는 크기로 0만들 수도 있습니다.dialog
  2. 또한 변수 이름을 CHOICE_HEIGHT로 바꾸었습니다 menu_height. 주로 dialog매뉴얼 페이지에 그렇게 설명되어 있기 때문입니다.
  3. 큰따옴표는 문자열에 변수 등을 삽입해야 할 때 사용됩니다. 고정 문자열에는 작은따옴표가 더 좋습니다.
  4. 제공된 취소 버튼 외에 "종료" 옵션을 추가 하고 다시 시작이 기본 옵션이 아니도록 명령문을 dialog --menu변경했습니다 . case이는 잘못된 기본값이며 사용자가 실수를 하거나 "취소" 버튼을 사용한 경우 컴퓨터가 재부팅되는 것을 원하지 않습니다.

위의 가장 중요한 항목(1과 2)은 이미 시작한 askubuntu.com의 참조 예에 있으며 너비와 높이가 모두 40x15입니다.

#!/bin/bash

width=72
height=22
menu_height=8
backtitle='Installer-menu'
title='Package options'
menu='Choose one of the following options:'

options=(1 'Install package list'
         2 'Export package list'
         3 'update and upgrade'
         x reboot
         q quit )

result=$(dialog --clear \
                --backtitle "$backtitle" \
                --title "$title" \
                --menu "$menu" \
                $height $width $menu_height \
                "${options[@]}" \
                2>&1 >/dev/tty)

case "$result" in
     1) echo while IFS= read -r line ... ;;
     2) echo awk -F'll' ... ;;
     3) echo 'sudo apt update && sudo apt upgrade' ;;
     x) echo reboot ;;
     q) clear; exit ;;
esac

관련 정보