尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

第42天 shell编程

第42天 shell编程 一.shell条件判断在 shell 脚本中条件判断是实现逻辑控制的基础,主要通过if语句、test命令[ ]和双括号[[ ]]等结构实现1.if语句1.基本if结构if ((表达式)); thenshell语句fi说明当((表达式))的结果为非零值(即条件为真)时执行then后的语句((表达式))是bash特有的算术表达式支持、-、*、/、、等运算符2.if-else结构if ((表达式)); thenshell语句1elseshell语句2fi说明 当表达式为真时执行shell语句1否则执行shell语句23.if-elif-else 结构if ((表达式1)); thenshell语句1elif ((表达式2)); thenshell语句2elif ((表达式3)); thenshell语句3...elseshell语句4fi说明按顺序检查每个表达式一旦某个表达式为真则执行对应的语句块并跳过后续所有elif和 else如果所有表达式都为假此时有else则执行else后的语句没有else则直接退出程序2.test命令在 shell 编程里test 命令的作用是比较数值和字符串、对条件进行测试等1.基本格式语法test 表达式 或 [ 表达式 ]本质调用test命令2.注意事项1.使用方括号 [ ] 这种形式时方括号和表达式之间必须有空格2.在使用变量时建议将变量用双引号引起来这样可以防止变量为空或包含空格时出现问题3.test 命令的返回状态码为0 表示条件成立非0 表示条件不成立和其他命令返回值规则是一样的3.test命令执行逻辑test命令本身是一个elf的可执行程序当执行test命令时后边的数据作为参数传递给test程序中的 main函数main函数中有两个参数argc和argv,通过这两个参数可以获得执行test程序时传递的参数 因此在表达式中出现参数运算符中括号前后必须添加空格1.数值判断用于比较两个整数的大小关系返回状态码0 (真)或1 (假)适用场景1.脚本中需要比较数字大小的逻辑(如判断年龄、版本号等等)2.循环条件(如while [ $i -le 10 ])操作符含义等价数学符号-eq等于-ne不等于!-gt大于-lt小于-ge大于等于-le小于等于2.字符串判断用于判断字符串的状态是否为空、非空比较字符串间是否相等、大小关系等返回状态码 0 (真) 或 1 (假)适用场景1.验证用户输入是否合规如用户名、密码是否为空是否符合格式要求2.文本处理中筛选、过滤特定字符串内容如在日志文件中查找特定关键词3.程序逻辑中根据字符串状态决定执行分支如在 if - then - else 结构中判断3.逻辑判断逻辑判断用于组合多个条件表达式形成更复杂的判断适用场景1.多条件筛选同时满足多个条件时执行操作如年龄 18 且 分数≥602.容错处理多个条件中只要满足一个即可执行操作如文件存在 或 目录可写3.权限验证验证用户是否属于特定角色或组如用户是 root 或 管理员组示例假设 a10, b20-a 逻辑与AND,同时都满足 [ $a -gt 5 -a $b -lt 30 ] (真)-o 逻辑或OR,满足其一即可 [ $a -eq 0 -o $b -eq 20 ] (真)! 逻辑非NOT,取反 [ ! -d $dir ] → 若目录不存在则为真4.文件判断用于检查文件或目录的状态是否存在、类型、权限等返回状态码 0 (真) 或 1 (假)1.适用场景1.脚本初始化与依赖检查在执行核心逻辑前确保必要的文件或目录存在且状态正确2.文件操作前的安全检查避免误操作导致数据丢失或权限问题3.条件性执行任务根据文件状态决定执行不同的分支 • 权限管理与安全控制限制脚本只在特定权限下执行2.注意事项1.始终用双引号包裹变量防止路径或变量值包含空格、通配符时被shell错误解析2.结合逻辑操作符处理多条件场景单一条件无法满足复杂需求需组合判断(如文件存在且可写)3.注意权限和文件类型的差异不同操作需要不同的文件类型和权限混淆会导致意外结果5.[[ ]]的使用在 shell 编程中[[ ... ]] 是 Bash 提供的高级条件测试语法基本语法if [[ 条件表达式1 ]]; thenshell语句1elif [[ 条件表达式2 ]]; thenshell语句2elseshell语句3fi主要优势1.无需转义特殊字符语法更简洁在 [[ ... ]] 中传统 [ ... ] 需要转义的特殊符号如 、、等2.支持短路求值提升执行效率逻辑操作符 逻辑与和 ||逻辑或具备短路特性当 左侧条件为假时右侧条件不再执行当 || 左侧条件为真时右侧条件不再执行3.语法更友好贴近自然逻辑[[ ... ]] 的条件表达式结构更接近自然语言无需记忆 -a逻辑与、 -o逻辑或等符号直接使用 /||降低学习成本4.安全处理未定义变量若变量未定义[[ ... ]] 会将其视为空字符串避免 [ ... ] 可能触发的语法错误对比条件判断的三种情况 6.case...in语句在 shell 编程中case...in 语句是一种多路分支结构用于根据不同的条件执行相应的代码块。基本语法case 变量 in模式1)命令序列1;;模式2)命令序列2;;*)默认命令序列;;esac优势1.代码简洁清晰相比使用大量 if - elif 语句case...in 能让多路分支逻辑更加直观代码结构一目了 然便于阅读和维护2.匹配灵活支持通配符匹配在处理文件名、设备名等具有一定模式特征的数据时非常方便适用场景1.交互式脚本如命令行工具、配置脚本等用于处理用户输入的不同选项2.文件类型或名称处理根据文件的扩展名或名称特征执行不同的操作如文件分类、备份策略选 择等3.系统状态检查脚本根据不同的系统状态标识如服务状态标识 执行相应的管理操作7.select...in语句select...in 是 shell 脚本中用于创建 交互式菜单 的专用命令主要用于引导用户通过键盘输入选择预设 选项。它会自动为每个选项生成编号从 1 开始用户输入对应数字即可触发相应操作适合需要频 繁与用户交互的场景如脚本配置、功能选择等基本语法select 变量名 in 选项1 选项2 选项3...do命令序列[break] # 可选用于退出循环done说明select 关键字标志着交互式菜单的开始后面紧跟用于存储用户选择的变量名 in 关键字分隔变量名和选项列表选项列表用空格分隔的多个选项支持字符串、变量等每个选项会自动对应一个编号 do...done循环体用户输入选择后会执行循环体内的命令序列。若未匹配到有效选项会重新 显示菜单提示优势1.自动生成交互菜单无需手动编写编号逻辑自动为选项生成从 1 开始的数字编号代码简洁菜 单格式统一规整2.输入流程简化用户仅需输入数字即可触发操作对无效输入自动循环提示降低交互成本3.循环控制灵活基于循环结构可通过break/continue实现单次或多轮交互适配不同场景需求4.低依赖易维护shell 内置命令无需第三方工具适合轻量化脚本功能分支模块化清晰适用场景1.交互式脚本配置引导用户完成系统配置菜单选数字触发功能提升易用性2.功能选择菜单为脚本多模块生成选择菜单输数字切换功能免记复杂参数3.循环交互式操作适用于重复任务菜单循环显示无需重启脚本4.简化用户输入逻辑替代手动输入自动编号菜单降低非技术用户操作成本二.shell中的循环结构1.for 循环适用于已知要遍历的元素集合如数组、列表或明确循环次数的场景通过依次迭代集合元素或按指 定数字范围来执行循环体;1.基本语法遍历列表:for 变量 in 列表或数组元素; do命令1命令2...done数字范围循环:for ((初始值; 条件; 增量或减量)); do命令1命令2...done1.优势语法简洁直观在处理固定集合或确定次数循环时代码逻辑清晰易于理解和编写2.应用场景遍历目录下文件、对数组元素逐一操作、按指定次数执行任务等2.while 循环根据条件判断结果决定是否执行循环体只要条件为真就持续循环直到条件为假时结束适用于条件 动态变化或不确定循环次数的情况1.基本语法while 条件判断; do命令1命令2...done说明1.在这个结构中条件判断可以是各种各样的测试像数值比较、字符串比较、文件状态检测等 2.只要条件判断的结果为真返回状态码 0循环体就会一直执行一旦条件判断结果为假返 回状态码非 0循环就会终止1.优势灵活性高能处理各种复杂的条件判断场景像等待文件出现、监控系统状态变化等2.应用场景等待特定条件满足如等待某个进程启动 、动态读取输入如交互式脚本等待用户输入符 合条件的值 、持续监控资源状态如磁盘空间、内存使用情况)等 3.until 循环与while循环相反until循环基于条件判断结果决定是否执行循环体不过是条件为假时持续循环一旦 条件变为真就结束循环适用于需要等待某个条件达成的场景1.基本语法until 条件判断; do命令1命令2...done2.执行逻辑1.条件判断可以是数值比较、字符串比较、文件状态检测等各种测试2.只要条件判断结果为假返回状态码非 0循环体就会一直执行3.当条件判断结果变为真返回状态码 0时循环终止3.优势在需要等待特定条件从假变为真的场景中逻辑表达更自然清晰避免在while循环中使用双重否 定条件例如不必写while [ ! -f file.txt ]而是直接用until [ -f file.txt ]);4.应用场景1.等待特定条件满足如等待文件出现、进程启动完成等2.重试操作直到成功如网络连接、命令执行成功3.需要确保循环体至少执行一次的情况类似其他语言中的do-while循环4.break和continue1.break 关键字1.功能break的作用是强制终止当前所在的循环无论循环条件是否仍然满足程序都会立即跳出该 循环然后继续执行循环体后面的代码2.使用场景常用于在满足特定条件时提前结束整个循环比如在找到目标值后停止搜索、在用户输 入退出指令时终止程序等情况2.continue 关键字1.功能continue的作用是跳过当前这一轮循环体中剩余的代码直接开始下一轮循环程序会忽略 continue后面的语句回到循环的起始处重新判断循环条件若条件满足则继续执行下一轮循环2.使用场景常用于过滤掉某些不需要处理的情况比如跳过不符合条件的数据、忽略错误输入等三.shell中的函数1.函数定义与调用在 shell 编程中函数是一种将多次使用的代码块封装起来的机制它可以提高代码的复用性和可维护性基础语法标准格式function 函数名() {命令1命令2...[return 返回值] # 可选返回值范围0-255}简化格式(省略function关键字)函数名() {命令1命令2...}函数调用直接使用函数名即可调用若函数需要参数直接跟在函数名后面参数之间用空格分隔2.函数参数参数传递在 shell 中函数通过位置参数接收传递给它的参数1.$1, $2, ..., $n表示第 1 到第 n 个参数2.$0表示脚本本身的名称在函数内部使用时它仍然表示脚本名而不是函数名3.$#表示参数的个数4. $或$*表示所有参数$将参数视为独立的个体$*将所有参数视为一个整体3.函数返回值1.通过return语句返回状态码功能设置函数的退出状态码范围 0-255用于表示函数执行的成功0或失败非 0。特点状态码可通过$?变量获取但仅能是整数return语句会立即终止函数执行类似exit但仅作用于函数2.通过echo输出返回结果功能将计算结果通过标准输出返回调用者可通过命令替换捕获。特点可返回任意文本内容不限于数字需避免在函数中输出调试信息以免干扰返回值4.函数输出捕获函数输出捕获则是获取函数实际计算结果如字符串、数值等的手段return 语句仅用于返回状态码设置函数退出状态码需结合$?获取限制仅能返回整数0-255主要用于表示执行状态而非数据结果使用 echo 输出 命令替换捕获通过echo将结果输出到标准输出再用$(...)或反引号捕获优点支持任意类型数据字符串、数字、多行内容现代 Shell 推荐用法语法清晰嵌套友好
返回列表