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

これら2つの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

関連情報