扩展练习果汁售卖:
(1)显示饮品菜单以及对应价格
(2)用户选择自己喜欢的饮品,根据用户选择可以计算出对应价格。
分析
- 定义一个饮品菜单和对应的价格数组,分别使用
menu
和prices
来存储。 - 使用
for
循环遍历饮品菜单和价格数组,并逐个输出菜单项及其价格,展示给用户。 - 使用循环和条件判断,允许用户选择喜欢的饮品编号和数量。用户输入的选择会被存储在
selections
这个关联数组中,其中饮品名作为关联数组的键,而数量作为对应的值。 - 计算总价时,使用嵌套的
for
循环遍历selections
数组,对每个饮品的数量和价格进行累加计算得到小计,然后将小计添加到总价中。 - 最后,根据总价和用户选择的饮品数量,输出用户选择的饮品及其总价格。
完整代码:
#!/bin/bash
# 饮品菜单及对应价格
menu=("橙汁" "苹果汁" "西瓜汁" "草莓汁" "蓝莓汁" "菠萝汁" "葡萄汁")
prices=(10 12 15 18 20 15 16)
# 显示饮品菜单及价格
echo "欢迎光临果汁店!这里是我们的饮品菜单:"
for ((i=0; i<${#menu[@]}; i++)); do
echo "$(($i+1)). ${menu[$i]} - ¥${prices[$i]}"
done
# 用户选择饮品及数量
declare -A selections
while true; do
read -p "请选择您喜欢的饮品编号(输入相应数字)和数量(输入数字)[结束选择请输入0]: " choice quantity
if [[ $choice -eq 0 ]]; then
break
elif [[ $choice =~ ^[1-7]$ && $quantity =~ ^[1-9][0-9]*$ ]]; then
index=$(($choice-1))
selected_beverage=${menu[$index]}
price=${prices[$index]}
selections[$selected_beverage]=$quantity
else
echo "无效的选择!请重新输入。"
fi
done
# 计算总价
total_price=0
selected_beverages=""
for beverage in "${!selections[@]}"; do
quantity=${selections[$beverage]}
price=${prices[$index]}
sub_total=$((price * quantity))
total_price=$((total_price + sub_total))
selected_beverages+=",${quantity}杯${beverage}"
done
# 输出结果
if [[ $total_price -gt 0 ]]; then
echo "您选择了${selected_beverages:2},总价格为¥$total_price。"
else
echo "没有选择任何饮品。"
fi
测试
该脚本允许用户选择多个饮品,并显示每个选项的完整名称(包括数量)。您可以根据需要进行修改和扩展,例如添加更多的饮品选项和价格,或者改进输入验证和用户体验,以满足更复杂的要求。
正则表达式
练习
- 显示/proc/meminfo文件中以不区分大小写的"s"开头的行:
grep -i "^[sS]" /proc/meminfo
- 显示/etc/passwd中以nologin结尾的行:
grep "nologin$" /etc/passwd
- 取出默认shell为/sbin/nologin的用户列表:
awk -F: '$7=="/sbin/nologin"{print $1}' /etc/passwd
- 取出默认shell为bash,且其用户ID号最小的用户的用户名:
awk -F: '$7=="/bin/bash"{print $1}' /etc/passwd | sort -t: -k3n | head -n1
- 显示/etc/inittab中以"#"开头,后面跟着一个或多个空白字符,而后跟了任意非空白字符的行:
grep "^#[[:space:]]\+[^[:space:]]" /etc/inittab
- 显示/etc/inittab中包含一个数值的行(即两个冒号中间有一个数字):
grep ":[0-9]:" /etc/inittab
- 显示/boot/grub2/grub.cfg文件中以一个或多个空白字符开头的行:
grep "^[[:space:]]" /boot/grub2/grub.cfg
- 显示/etc/inittab文件中以一个数字开头,并以与开头数字相同的数字结尾的行:
grep "^1.*1$" /etc/inittab
- 找出/proc/cpuinfo中的1位数或2位数:
grep "\<[0-9]\{1,2\}\>" /proc/cpuinfo
- 查找当前系统上名字为student(必须出现在行首)的用户的账号相关信息,文件为/etc/passwd:
grep "^student:" /etc/passwd