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