shell脚本中常用的菜单模板

本文介绍了一个使用Bash编写的菜单脚本示例,该脚本利用tput命令进行美化显示,包括版本信息、标题及选项列表,并提供用户交互功能。

直接上代码:

#!/bin/bash

# 菜单模板
function menu(){
	: '
		参数1:版本信息
		参数2:名称
		参数3:操作项列表
	'
	# 清屏
	tput clear
	# 将光标移动至(3,15)处
	tput cup 3 15

	# Set a foreground colour using ANSI escape
	# 展示版本信息
	tput setaf 3
	echo $1
	tput sgr0

	# 展示标题
	tput cup 5 17
	tput rev # 反向终端
	tput bold
	echo $2
	tput sgr0

	mark=7
	# 遍历带空格的字符串数组时,迭代项需要加引号
	for option in "${options[@]}"
	do
		tput cup $mark 15
		echo $option
		((mark++))
	done

	# 继续下一个行设置输入提示消息,下一行以当前的mark值为准
	tput bold
	tput cup $mark 15
	read -p "Enter your choice->" choice
	tput clear
	tput sgr0
	tput rc
}


# 测试程序
function test(){
	versioninfo="by howie"
	title="分支选择"
	options=("1. develop"
			 "2. release"
			 "q. 退出")
	menu "$versioninfo" "$title" $options
}

这里用到tput的相关知识,在另一篇帖子中讲解

<think>我们专注于用户的问题:Shell脚本中循环的写法。根据用户提供的引用内容,我们可以总结出Shell脚本中常见的循环结构:for循环(包括多种形式)、while循环和until循环。下面我们将详细解释每种循环的语法和用法,并给出示例。 ### 1. for循环 for循环用于遍历一组值(列表、范围、命令输出等)或使用C语言风格的循环。 #### (1) 遍历列表 语法: ```bash for 变量 in 值1 值2 ... 值n do 命令序列 done ``` 示例:打印数字1到5 ```bash for i in 1 2 3 4 5 do echo "Number: $i" done ``` #### (2) 遍历范围 可以使用花括号扩展生成数字序列。 ```bash for i in {1..5} do echo "Number: $i" done ``` #### (3) 遍历命令输出 将命令的输出作为循环的列表。 ```bash for file in $(ls) do echo "File: $file" done ``` 注意:这种方法在处理文件名中有空格时可能会出现问题,可以使用`find`命令结合`while`循环来避免。 #### (4) C语言风格的for循环 语法: ```bash for ((初始化; 条件判断; 变量变化)) do 命令序列 done ``` 示例:打印0到4 ```bash for ((i=0; i<5; i++)) do echo "Number: $i" done ``` ### 2. while循环 while循环在条件为真时执行循环体。 语法: ```bash while [ 条件 ] do 命令序列 done ``` 注意:条件可以使用测试命令`[ ]`或`[[ ]]`,也可以是命令,其退出状态为0(真)时执行循环。 示例:打印1到5 ```bash i=1 while [ $i -le 5 ] do echo $i let i++ # 或 i=$((i+1)) done echo "最后i的值为: $i" ``` ### 3. until循环 until循环与while循环相反,它在条件为假时执行循环体,直到条件为真。 语法: ```bash until [ 条件 ] do 命令序列 done ``` 示例:打印1到5 ```bash i=1 until [ $i -gt 5 ] do echo $i i=$((i+1)) done ``` ### 循环控制语句 在循环中,我们可以使用`break`和`continue`来控制循环流程。 - `break`:跳出整个循环。 - `continue`:跳过本次循环,进入下一次循环。 ### 示例:综合使用循环和函数 下面是一个结合函数和循环的示例,该函数打印水果清单并让用户选择,然后循环选择直到用户输入正确的选项。 ```bash #!/bin/bash # 定义函数:打印菜单 menu() { cat <<-EOF 欢迎选购,今日水果清单如下: 1.苹果 2.香蕉 3.菠萝 4.橘子 5.猕猴桃 EOF } # 定义函数:打印欢迎信息 hello() { echo "您好,欢迎下次光临!" } # 使用循环让用户选择直到输入正确 while true do menu read -p "请输入你要选择的水果编号(1-5, q退出): " num case $num in 1) echo "您选择的是苹果"; break;; 2) echo "您选择的是香蕉"; break;; 3) echo "您选择的是菠萝"; break;; 4) echo "您选择的是橘子"; break;; 5) echo "您选择的是猕猴桃"; break;; q|Q) echo "退出"; exit 0;; *) echo "请选择1-5之间的数字或q退出";; esac done hello ``` ### 注意事项 - 在循环中修改循环条件变量,避免死循环(如while循环中要有变量递增)。 - 对于文件遍历,推荐使用`while`循环和`find`命令来处理带空格的文件名,例如: ```bash find . -type f -print0 | while IFS= read -r -d $'\0' file; do echo "处理文件: $file" done ``` ### 总结 Shell脚本中循环结构包括: - **for循环**:适用于已知循环次数或遍历集合。 - **while循环**:适用于条件满足时重复执行。 - **until循环**:与while相反,条件不满足时执行。 根据实际需求选择合适的循环结构,并注意循环控制语句的使用。 §§相关问题§§ 1. Shell脚本中如何处理带有空格的文件名遍历? 2. while循环和until循环的区别是什么? 3. 如何在Shell脚本中实现嵌套循环? 4. 循环控制语句`break`和`continue`有哪些高级用法? </think>### Shell脚本中的循环语句详解 循环是Shell脚本的核心结构,用于重复执行代码块。下面结合引用内容详细讲解三种主流循环写法及其应用场景。 --- #### 一、`for` 循环 **语法模板**: ```bash for 变量 in 序列 do 命令块 done ``` **分支形式**: 1. **遍历显式列表** ```bash for i in a b c d e # 或 1 2 3 4 5 do echo $i done ``` **输出**: ``` a b c d e ``` 2. **遍历范围序列** ```bash for i in {1..5} # 生成1-5的整数序列 do echo "Number: $i" done ``` 3. **遍历命令输出** ```bash for file in $(ls /tmp) # 解析ls命令的结果 do echo "Found: $file" done ``` 4. **C语言风格** ```bash for ((i=0; i<5; i++)) do printf "C-style: %d\n" $i done ``` --- #### 二、`while` 循环 **语法模板**: ```bash while [ 条件 ] do 命令块 done ``` **关键特性**: - 条件为真时持续执行(需避免死循环) - 必须包含改变条件的语句 **示例**: ```bash i=1 while [ $i -le 5 ] # -le: 小于等于 do echo $i let i++ # 或 i=$((i+1)) done echo "最终值: $i" # 输出6 ``` **执行流程**: ``` 1 → 2 → 3 → 4 → 5 → 退出循环 → 输出"最终值: 6" ``` --- #### 三、`until` 循环 **语法模板**: ```bash until [ 条件 ] do 命令块 done ``` **关键特性**: - 条件为假时执行,与`while`相反 - 适合任务重试场景 **示例**: ```bash count=3 until [ $count -eq 0 ] # 等于0时停止 do echo "倒计时: $count" ((count--)) done ``` **输出**: ``` 倒计时: 3 倒计时: 2 倒计时: 1 ``` --- ### 循环控制语句 | 指令 | 作用 | 示例 | |-----------|----------------------|--------------------------| | `break` | 立即退出整个循环 | `while true; do ... break; done` | | `continue`| 跳过本次循环剩余部分 | `for i in {1..3}; do [ $i -eq 2 ] && continue; echo $i; done` | --- ### 循环与函数结合实践 ```bash #!/bin/bash # 函数定义:打印菜单[^4] menu() { cat <<-EOF 1. 苹果 2. 香蕉 3. 退出 EOF } # 主循环 while true do menu read -p "选择: " choice case $choice in 1) echo "选择了苹果";; 2) echo "选择了香蕉";; 3) break;; # 退出循环 *) echo "无效选项";; esac done echo "程序结束" ``` --- ### 性能与陷阱指南 1. **文件名处理** 遍历含空格的文件需用: ```bash find . -print0 | while IFS= read -r -d $'\0' file do echo "处理: $file" done ``` 2. **死循环预防** - `while`循环必须有改变条件的操作 - 关键服务循环需添加超时机制: ```bash timeout=10 while [ $timeout -gt 0 ]; do ((timeout--)) # 操作... done ``` --- ### 三种循环对比表 | 类型 | 适用场景 | 退出条件 | 典型用例 | |---------|-----------------------------|----------------|------------------------| | `for` | 已知迭代次数/遍历集合 | 序列耗尽 | 文件批量重命名 | | `while` | 条件满足持续执行 | 条件变为假 | 监控日志实时处理 | | `until` | 条件不满足时执行 | 条件变为真 | 服务启动状态检测 | --- ### 测试练习 将以下Python循环转为Shell脚本: ```python for n in range(1,6): if n%2==0: print(f"{n}是偶数") ``` **Shell实现**: ```bash for n in {1..5} do if [ $((n % 2)) -eq 0 ]; then echo "$n 是偶数" fi done ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值