this is my first time dabbling in bash scripting and first time using this site. I’m working on script that’s meant to provide the user with a list of software packages to install and then output their choices into a 2nd script file that can be run later to actually install their choices. So far my script is semi working, but I need help figuring out how to; A) Loop the script so once they’ve chosen a package it restarts and allows them to select another instead of ending the script B) When they select “No” or “nN” to the confirmation it takes them back to choice list instead of wigging out and if they input anything other than yes/no it prompts for valid input
Here is my current script, I understand it’s probably formatted horribly and most likely inefficient but it’s my first time and only for a small school project I’m working on. Any help would be appreciated, thanks!
#!/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
Thank you @janos that’s pretty much exactly what I wanted! 🙂 The only other thing I’d like to change is the dir the script is created in (to something more default) so I can use it on any system. I also made a small adjustment to each choice so the “No” prompt now works as well.
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
;;
Advertisement
Answer
The case statement can help a lot to simplify the implementation of the menu.
To repeat steps, you can use an infinite loop:
while true; do
# ...
done
Applying the above suggestions, and then some, the script can be corrected and improved:
#!/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