2017-11-26 11 views
0

これは私の初めてのbashスクリプトとこのサイトを使った初心者です。私は、インストールするソフトウェアパッケージのリストをユーザーに提供し、後で実際に選択肢をインストールするために後で実行できる2番目のスクリプトファイルに選択肢を出力するためのスクリプトに取り組んでいます。 これまでのところ、私のスクリプトは半作業ですが、どうすればよいか分かりました。 A)スクリプトを一度ループして再起動し、スクリプトを終了し、スクリプトを終了する代わりに別のスクリプトを選択できるようにする B)確認に「No」または「nN」を選択すると、 yes/no以外のものを入力した場合、有効な入力を促しますbashスクリプトをループする

これは私の現在のスクリプトですが、恐らくフォーマットがひどく、非効率である可能性が高いと思いますが、初めての小規模な学校私が取り組んでいるプロジェクト。どんな助けもありがとう、ありがとう!

#!/bin/bash 

#bash script to present list of packages for customer install output to txt 

if [[ ! -e /home/aarone/pkglist.txt ]]; then 
      echo "Making package list script" 
      echo "#!/bin/bash" > /home/aarone/pkglist 
      chmod -R 777 /home/aarone/pkglist 
fi 

# Declare variable choice and assign value 4 
choice=4 


# print to stdout 
    echo "1. Antivirus GUI" 
    echo "2. Firewall GUI" 
    echo "3. MariaDB" 
    echo -n "Please choose a A package [1,2 or 3]? " 
# Loop while the variable choice is equal 4 
# bash while loop 
while [ $choice -eq 4 ]; do 


#read user input 
read choice 

# bash nested if/else 
if [ $choice -eq 1 ] 
then 

     echo "You have chosen word: Antivirus GUI" 
     apt show clamtk 2>/dev/null | egrep '^Description|^Download' 
     read -r -p "Are you sure? [y/N] " response 
     if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
     then 
      echo "apt-get clamtk" >> pkglist 
     else 
      echo "Input not understood" 
      continue 
     fi 


else 

     if [ $choice -eq 2 ] ; then 

       echo "You have chosen package: Firewall GUI" 
       apt show gufw 2>/dev/null | egrep '^Description|^Download' 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get gufw" >> pkglist 
       else 
       read choice 

       fi 
     else 

       if [ $choice -eq 3 ] ; then 

       echo "You have chosen package: Office" 
       apt show libreoffice 2>/dev/null | egrep '^Description|^Download' 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get libreoffice" >> pkglist 
fi 

       else 
        echo "Please make a choice between 1-3 !" 
        echo "1. Antivirus GUI" 
        echo "2. Firewall GUI" 
        echo "3. Office application" 
        echo -n "Please choose a word [1,2 or 3]? " 
        choice=4 
       fi 
     fi 
fi 
done 

ありがとうございました@ジャノスは、私が欲しかったものです。 :)私が変更したい唯一の他のものは、スクリプトが作成されたディレクトリ(よりデフォルトのもの)ですので、どのシステムでも使用できます。 また、それぞれの選択肢に小さな調整を加えて、「いいえ」プロンプトも機能するようにしました。

1) 
      echo "You have chosen package: Antivirus GUI" 
      apt show clamtk 2>/dev/null | egrep '^Description|^Download' 
      while true; do 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get install -y clamtk" >> "$pkglist" 
        break 
       elif [[ "$response" =~ ^([nN][oO]|[nN])+$ ]] 
       then 
        echo "Cancelled" 
        break 
       else 
        echo "Input not understood" 
       fi 
      done 
      ;; 
+1

が何であれ* 'chmod 777'は間違っていて危険です***あなたのユースケースに必要なパーミッションを知る必要があります。しかし、実際には、匿名の侵入者を含むユーザーにファイルへの完全な書き込みアクセス権を与えることは実質的にありません。 – tripleee

+0

しばらくお待ちください 'chmod 777' – janos

答えて

2

caseステートメントは、メニューの実装を簡単にするのに役立ちます。上記の提案を適用

while true; do 
    # ... 
done 

、その後、いくつかは、 スクリプトを修正することができ、改善された:手順を繰り返し

は、あなたが無限ループを使用することができ、それはあなたが

#!/bin/bash 

pkglist=/home/aarone/pkglist.txt 
if [[ ! -e "$pkglist" ]]; then 
    echo "Making package list script" 
    echo "#!/bin/bash" > "$pkglist" 
    chmod -R 777 "$pkglist" 
else 
    echo Package list script already exists. Exiting. 
    exit 1 
fi 

while true; do 
    echo "1. Antivirus GUI" 
    echo "2. Firewall GUI" 
    echo "3. MariaDB" 
    echo "x. Exit" 
    printf "Please choose a A package [1, 2 or 3]? " 
    read choice 

    case "$choice" in 
     1) 
      echo "You have chosen word: Antivirus GUI" 
      apt show clamtk 2>/dev/null | egrep '^Description|^Download' 
      while true; do 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get clamtk" >> "$pkglist" 
        break 
       else 
        echo "Input not understood" 
       fi 
      done 
      ;; 

     2) 
      echo "You have chosen package: Firewall GUI" 
      apt show gufw 2>/dev/null | egrep '^Description|^Download' 
      while true; do 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get gufw" >> "$pkglist" 
        break 
       else 
        echo "Input not understood" 
       fi 
      done 
      ;; 

     3) 
      echo "You have chosen package: Office" 
      apt show libreoffice 2>/dev/null | egrep '^Description|^Download' 
      while true; do 
       read -r -p "Are you sure? [y/N] " response 
       if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]] 
       then 
        echo "apt-get libreoffice" >> "$pkglist" 
        break 
       else 
        echo "Input not understood" 
       fi 
      done 
      ;; 

     *) 
      break 
    esac 
done 
関連する問題