Linux 循环bash脚本

Linux 循环bash脚本,linux,bash,shell,ubuntu,scripting,Linux,Bash,Shell,Ubuntu,Scripting,这是我第一次涉足bash脚本,也是第一次使用这个网站。我正在编写一个脚本,该脚本旨在为用户提供要安装的软件包列表,然后将他们的选择输出到第二个脚本文件中,稍后可以运行该脚本文件来实际安装他们的选择。 到目前为止,我的脚本是半工作,但我需要帮助找出如何; A) 循环脚本,这样一旦他们选择了一个包,它就会重新启动,并允许他们选择另一个包,而不是结束脚本 B) 当他们选择“否”或“nN”进行确认时,它会将他们带回选择列表,而不是退出,如果他们输入的不是“是/否”,它会提示输入有效信息 这是我目前的剧本

这是我第一次涉足bash脚本,也是第一次使用这个网站。我正在编写一个脚本,该脚本旨在为用户提供要安装的软件包列表,然后将他们的选择输出到第二个脚本文件中,稍后可以运行该脚本文件来实际安装他们的选择。 到目前为止,我的脚本是半工作,但我需要帮助找出如何; A) 循环脚本,这样一旦他们选择了一个包,它就会重新启动,并允许他们选择另一个包,而不是结束脚本 B) 当他们选择“否”或“nN”进行确认时,它会将他们带回选择列表,而不是退出,如果他们输入的不是“是/否”,它会提示输入有效信息

这是我目前的剧本,我知道它的格式可能很糟糕,而且效率很可能很低,但这是我第一次,只是为了我正在做的一个小的学校项目。任何帮助都将不胜感激,谢谢

#!/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
谢谢@janos这正是我想要的!:)我唯一想更改的另一件事是创建脚本的目录(默认设置),这样我就可以在任何系统上使用它。 我还对每个选项做了一个小的调整,这样“否”提示现在也可以工作了

 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
            ;;

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

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

无论你想做什么,
chmod 777
都是错误和危险的。您应该弄清楚您的用例需要什么权限;但这实际上并不包括给予任何用户(包括匿名入侵者)对您的文件的完全写访问权。请永远不要使用
chmod 777
无论您试图实现什么,
chmod 777
都是错误和危险的。您应该弄清楚您的用例需要什么权限;但这实际上并不包括给予任何用户(包括匿名入侵者)对您的文件的完全写访问权。请永远不要使用
chmod 777