ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Cosmos 仓库 Shell 脚本编程指南:从基础语法到 Make 自动化构建

Cosmos 仓库 Shell 脚本编程指南:从基础语法到 Make 自动化构建 教程示例工程【免费下载链接】cosmosWorlds largest Contributor driven code dataset | Used in Quark Search Engine, OpenGenus IQ, OpenGenus Visual Project项目地址https://gitcode.com/gh_mirrors/co/cosmos点击查看免费下载导读Shell 是 Linux 系统中连接内核Kernel与操作者用户、机器的接口而 Shell 脚本则是把一条条 Shell 命令组织成可自动执行的程序用于工作流自动化、批处理、重复任务与定时调度。本文以 code/shell_script/README.md 为核心骨架结合仓库内 basic_scripts、control_structures、functions、Looping 与 make_and_makefile 五个模块的真实源码系统讲解 Shell 脚本的编写、控制结构、函数、循环以及 Make/Makefile 构建自动化。读完本文你将掌握在 Linux 环境下从零编写、调试并自动化运行 Shell 脚本的完整实战方案。Shell 与脚本的基本概念什么是 Shell在 Linux 操作系统中Shell是 CPU 内核与操作者人类用户或机器之间的接口。它通过命令行提供交互界面普通用户看到$提示符而 root超级用户看到#提示符。关键特性Shell 是一个解释器。若在 Shell 中指定一组代码它会一条一条地依次执行即使中间某条命令出错也会继续执行后面的命令。Linux 常见的 Shell 类型包括Bourne ShellshBourne Again ShellbashKorn ShellkshTurbo ShelltcshC-Shellcsh等仓库内所有示例脚本均以#!/bin/bash作为 shebang 首行即选用 Bash 作为解释器这是当前 Linux 发行版中最常用的默认 Shell。什么是脚本与 Shell 脚本脚本Script是一组能自动执行的代码。脚本可以通过以下三种方式被调用使用触发器triggers使用调度器Crontab、Anacron、at等定时执行手动调用在终端执行脚本文件。Python、JavaScript 与 Shell 脚本是目前最流行的几种脚本语言。Shell 脚本就是使用 Linux Shell 语法编写的一组代码主要用于自动化工作流Automate the workflow执行批处理任务Batch tasks执行重复性任务Repetitive tasks使用 Cron 等调度器定时执行任务Schedule tasks。仓库根目录下正好提供了一个调度/清理类脚本示例 deleting_old_archives.sh可作为“自动化重复任务”的直观参考。基础 Shell 脚本实战本节对应 basic_scripts 目录仓库为每个主题提供了可直接运行的单文件示例源码位于 basic_scripts/src。Hello World脚本的第一行HelloWorld.sh 是最简示例#!/bin/bash echo Hello World要点#!/bin/bash称为 shebang声明脚本由 Bash 解释执行echo用于向标准输出打印文本。运行时先执行chmod x HelloWorld.sh赋予执行权限再通过./HelloWorld.sh调用。变量声明变量脚本 variable.sh 演示了三种情况#!/bin/bash # creating a normal variable var1Variable 1; # No spacing between variable name and value else error echo $var1; # Changing value of variable 1 var1Variable 1 updated; echo $var1; # Creating readonly variable readonly var2Readonly var; echo $var2; var2Can I change?; echo $var2;三个关键点赋值时变量名与值之间不能有空格否则会报错普通变量可以随时重新赋值readonly声明只读变量后续再次赋值不会生效示例中var2Can I change?后仍保持原值。从用户读取输入readvar.sh 展示了read命令的三种用法#!/bin/bash # Reading variable without prompting users read var1 echo $var1 # Reading variable by prompting user read -p Enter a value: var2 echo $var2 # Reading a silent variable by prompting user read -sp Enter a value: var3 echo # By default it has an endline attached echo $var3read var1无提示读取read -p 提示语 var2带提示读取-p promptread -sp 提示语 var3静默读取-s silent用于密码等敏感输入输入不回显且需自行补一个echo 换行。标准输入输出组合示例inout.sh 把命令替换、标准输出与read组合起来#!/bin/bash echo Hello $(whoami)! I am your assistant! read -p Enter your real name: name echo Hello $name$(whoami)是命令替换语法将whoami命令的输出嵌入到字符串中展示“脚本输出 系统命令 用户输入”的典型交互流程。取消变量unsetdeletevar.sh 演示unset#!/bin/bash var1Variable to be deleted!; echo $var1; unset var1; echo Printing unset variable: $var1; # Trying unset keyword on readonly readonly var2Readonly var; echo $var2; unset var2; echo $var2;unset用于删除变量。脚本特意验证了readonly变量对其执行unset不会生效变量值依然保留。特殊变量specialvar.sh 列出了最常用的特殊变量#!/bin/bash echo Current File Name: $0 echo Process number of current Shell: $$ echo Process Number of last background command: $! echo Exit ID of last executed command: $?$0当前脚本文件名$$当前 Shell 的进程号PID$!最近一个后台命令的进程号$?上一条已执行命令的退出状态码0 表示成功。命令行参数commandlineargument.sh 演示如何读取调用脚本时传入的参数#!/bin/bash echo Command Line Arguments echo File name: $0; echo First Argument: $1; echo Second Argument: $2; echo Number of Arguments sent: $#; echo All arguments in same quotes: $*; echo All arguments in individual quotes: $;$1、$2第 1、2 个位置参数$#传入参数的总个数$*以单个字符串形式输出所有参数$以多个独立字符串形式输出所有参数在循环遍历时两者行为有差异。基本算术运算arithmetic.sh 演示了$(())双括号算术展开#!/bin/bash echo Arithmetic Operations on Shell; read -p Enter an Real value: val1 read -p Enter another Real value: val2 echo Addition: $(($val1$val2)) echo Subtraction: $(($val1-$val2)) echo Multiplication: $(($val1*$val2)) div$(($val1/$val2)) echo Division: ${div}加、减、乘、除均可通过$((表达式))完成结果也可赋值给变量如div$(($val1/$val2))。注意 Shell 算术仅支持整数除法为整除。控制结构条件分支与决策控制结构用于决策检查某个条件根据条件为真或假走不同的执行路径。仓库 control_structures 模块 提供了两类控制结构。If-Elif-Else-fiif_elif_else.sh 是比较两个数字的完整示例#!/bin/bash echo Enter two numbers read num1 read num2 if [ $num1 -gt $num2 ] then echo $num1 is greater than $num2 elif [ $num1 -eq $num2 ] then echo Both numbers are equal else echo $num2 is greater than $num1 fi语法要点条件写在方括号[ ... ]中两侧必须有空格数值比较使用-gt大于、-eq等于等运算符而非、分支体以then开始整个结构以fiif 反写结束支持if/if-else/if-elif-else三种形态。仓库另有更精简的 if_else.sh 展示基础二分支写法。Case 分支switch-caseswitch_case.sh 用case实现多路分支#!/bin/bash read -p Enter your name: name case $name in admin) echo Access Granted! Welcome Admin ;; root) echo Access Granted! Welcome root ;; *) echo Access Denied ;; esac结构以case $变量 in开始以esaccase 反写结束每个分支形如模式) 命令 ;;双分号;;表示该分支结束*是通配分支相当于默认分支else匹配所有未命中的情况。函数代码复用与模块化函数是一段实现独立编程逻辑的代码子集。以四则运算计算器为例独立逻辑包括加法函数、乘法函数、除法函数、减法函数。函数允许把大问题拆分为多个独立小问题提升可理解性与可调试性其最大优势是代码复用——一个函数写好后同一任务无需重复定义直接以函数名调用即可。仓库 functions 模块 提供了 7 个示例。定义与调用function.sh 是最简结构#!/bin/bash # Create function function1() { echo Inside Function body; } # Invoke Function using function name function1定义语法为函数名() { ... }调用时直接写函数名function1即可无需括号。函数参数与返回值func_parameters.sh演示向函数传递参数函数体内通过$1、$2等位置变量接收return_code.sh演示函数返回码的使用nestedfunction.sh演示函数内嵌套调用其他函数multiplefunctioncall.sh 与 multicall.sh演示脚本中对同一/多个函数的多点调用。变量作用域scope.sh 演示全局变量与局部变量#!/bin/bash # Declaring a global variable gvarI am the global variable!!! # Define a function function1() { # Declaring a local variable lvarI am the local variable echo $gvar echo $lvar } # Call the function function1脚本中在函数外部声明的gvar是全局变量函数内部声明的lvar是局部变量函数体内可以同时访问两者。默认情况下 Shell 变量作用域较宽松如需强制局部作用域可在函数内使用local关键字声明。循环结构循环用于以轻微变化重复执行同一段逻辑。Shell 提供for 循环与while 循环两大类对应仓库 Looping 模块 下的 for_loop 与 while_loop。For 循环for_seq.sh 使用seq生成序列#!/bin/bash for i in seq 1 10 do echo This is $i increment donefor i in 列表遍历序列do ... done包裹循环体。仓库 for_loop 目录还提供了丰富变体for_items.sh遍历字符串/列表项for_increment.sh步进式递增循环for_infinite.sh无限循环for_break.shbreak提前退出for_continue.shcontinue跳过本次迭代for_jump.sh跳跃式遍历for_ctype.sh 与 forloop_tuple.sh其他 for 语法变体。While 循环while_basics.sh 是基础计数循环#!/bin/bash i1 while [ $i -le 5 ] do echo $i; i$(($i1)); done条件为真时反复执行循环体i$(($i1))手动递增计数器以避免死循环。仓库另提供 while_infinite.sh 演示 while 无限循环的写法。Make 与 Makefile编译构建自动化当源码复杂、涉及多个文件与库的导入时手工编译繁琐且易错此时可使用Make这一自动化工具来编译并构造可执行二进制文件。仓库 make_and_makefile 目录 提供了一个完整的 C 语言多文件计算器项目作为实战样例。Make 与 Makefile 的核心机制Make一个自动化构建工具主要用于从包含多个导入和库的复杂源码编译、构造可执行二进制文件Makefilemake命令依据 Makefile 中的规则了解构建二进制的步骤。默认情况下若未显式指定文件名make会优先查找名为Makefile的文件因此该文件通常就叫这个名字。仓库实战样例多文件计算器该目录包含以下构建素材入口源码 main.c头文件 mymath.h分模块实现 add.c、subtract.c、multiply.c、divide.c构建规则文件 MakefileMakefile 内容如下mycalculator: main.c mymath.h add.c subtract.c multiply.c divide.c gcc -o mycalculator main.c mymath.h add.c subtract.c multiply.c divide.c规则结构为目标: 依赖文件列表换行后紧跟一个Tab 缩进的构建命令此处为gcc编译链接命令。执行流程在 make_and_makefile 目录下运行makemake检查目标mycalculator与其依赖文件的时间戳若依赖较新或目标不存在则执行gcc命令一次性编译main.c、add.c、subtract.c、multiply.c、divide.c并链接成可执行文件mycalculator生成的二进制即仓库中的 mycalculator运行它即可获得四则运算计算器。这个样例同时印证了本仓库 functions 模块 提到的“四函数计算器”思想——加法、乘法、除法、减法各自独立成函数/文件再通过 Makefile 统一组装。动手实践建议直接运行仓库示例进入各模块目录执行bash 文件名.sh或先chmod x再./文件名.sh参数化实验对 commandlineargument.sh 执行./commandlineargument.sh a b c观察$#、$*、$的输出差异组合练习把 switch_case.sh 的分支逻辑封装成函数再放入 for 循环中处理多条输入即可完整串联本指南的变量、控制结构、函数与循环四大主题构建实验修改 Makefile 中任一.c文件的依赖后重新运行make体会增量构建与依赖追踪的自动化价值。总结本文以 code/shell_script/README.md 的完整知识框架为骨架逐一展开 Shell 解释器与脚本概念、基础语法变量、输入输出、特殊变量、命令行参数、算术、控制结构if/elif/else、case、函数定义、参数、返回值、作用域、循环for/while 及其变体并以仓库自带的 Makefile 多文件计算器项目演示了构建自动化。所有结论均有仓库 code/shell_script 目录下的真实脚本与 Makefile 支撑可作为读者继续深入 basic_scripts、control_structures、functions、Looping 与 make_and_makefile 各模块的索引与起点。赞分享教程示例工程【免费下载链接】cosmosWorlds largest Contributor driven code dataset | Used in Quark Search Engine, OpenGenus IQ, OpenGenus Visual Project项目地址https://gitcode.com/gh_mirrors/co/cosmos点击查看免费下载相关推荐如何为夸克自动转存开发自定义插件从入门到精通的开发者指南如何为夸克自动转存开发自定义插件从入门到精通的开发者指南 夸克自动转存quark_auto_save是一款功能强大的开源工具能够实现夸克网盘签到、自动转后端任务调度工作流自动化AI 技能TagUI脚本编写指南从基础语法到高级技巧TagUI脚本编写指南从基础语法到高级技巧 1. 引言为什么选择TagUI进行RPA自动化 在当今数字化时代重复性的网页操作和数据处理任务消耗着大量人力GUI 自动化浏览器控制工作流自动化CS-Script高级用法如何构建企业级脚本应用的完整指南CS Script高级用法如何构建企业级脚本应用的完整指南 CS Script作为一款成熟的C 脚本平台不仅适合快速原型开发更具备构建企业级脚本应用的强大CLI开发工具语言运行时上一篇ESP32终极开发指南从硬件架构到OTA升级的完整实践下一篇如何永久保存微信聊天记录免费开源工具WeChatMsg完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表