学习笔记3
一门程序设计语言具有以下必备的要素和技能:
- 语法:了解语言的基本语法规则,包括变量、数据类型、运算符、控制流程(如条件语句和循环语句)、函数定义等。
- 数据结构:理解常见的数据结构,如数组、链表、栈、队列、树、图等,并能够灵活地应用于实际问题中。
- 算法:掌握常见的算法思想与实现,如排序、搜索、递归、动态规划等,以提高代码的效率和质量。
- 编程范式:了解不同的编程范式,如面向对象编程、函数式编程、并发编程等,以便选择适合的方式来解决问题。
- 调试和错误处理:具备调试程序和处理错误的能力,能够定位和修复代码中的Bug,并做好异常处理。
在Shell脚本中,这些要素和技能也有相应的呈现方式:
- 语法:编写符合Shell脚本语法规则的代码,包括正确使用变量、操作符、条件语句(如if-else语句)和循环语句(如for循环和while循环)等。
- 命令行操作:熟悉Shell的命令行操作,包括文件操作、目录操作、进程管理等,能够通过Shell脚本实现自动化的批量处理任务。
- 环境变量和配置:了解Shell环境变量的概念和使用方法,能够在脚本中读取、设置和使用环境变量,以便实现灵活的配置和参数传递。
- 输入和输出处理:能够合理处理输入和输出,包括读取用户输入、从文件中读取数据、将结果输出到文件或终端等。
- 错误处理和异常处理:编写健壮的代码,能够处理意外情况和错误,包括输入错误、文件不存在、命令执行失败等,并提供相应的错误信息和处理措施。
第十章
- sh脚本
- sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。
- 创建文件文本mysh,包含:
使用chmod +x mysh使其可执行,然后运行mysh#!/bin/bash #comment line echo hello
- sh脚本与C程序
- sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。而C程序必须编译链接到一个二进制可执行文件,然后通过主sh的子进程运行可执行二进制文件。
- C程序中,每个变量都有特点的不同类型,而sh脚本中所有变量都是字符型。
- 命令行参数
- 可使用与运行sh命令完全相同的参数调用sh脚本,如
mysh one two three
- 可使用参数$0、$1、$2等访问命令行参数
- 可使用内置变量$#和$*计数并显示命令行参数
$# = 命令行参数$1到$n的数量 $* = 所有命令行参数,包括$0
- 其他的相关内置变量
$S = 执行sh的进程PID $? = 最后一个命令执行的退出状态(如果成功,则为0,否则为非0)
- 可使用与运行sh命令完全相同的参数调用sh脚本,如
- sh变量
- 内置变量
- PATH
- HOME
- TERM
- sh变量的设置或赋值:
variable=string
- 内置变量
- sh中的引号
- sh中的特殊字符,如$、/、*、>、<等,要想把它们用作普通字符,可使用\或单引号来引用它们
- sh语句
- sh语句包括所有Unix/Linux命令,以及可能的I/O重定向
示例:
此外,sh编程语言还支持控制sh程序执行的测试条件、循环、case等语句ls ls > outfile date cp f1 f2 mkdir newdir cat < filename
- sh语句包括所有Unix/Linux命令,以及可能的I/O重定向
- sh命令
- 内置命令
- 常用的sh内置命令
.file:读取并执行文件 break [n]:从最近的第n个嵌套循环中退出 cd [dirname]:更换目录 continue [n]:重启最近的第n个嵌套循环 eval [arg...]:计算一次参数并让sh执行生成的命令。 exec [arg...]:通过这个sh执行命令,sh将会退出。 exit [n]:使sh退出,退出状态为n。 export [var…]:将变量导出到随后执行的命令. trap [arg] [n]:接收到信号n后执行参数。 umask [ddd]:将掩码设置为八进制数 ddd 的。 wait pid]: 等待进程 pid,如果没有给出pid,则等待所有活动子进程。 read命令:当sh执行read命令时,它会等待来自stdin的输入行。
- Linux命令
- echo命令:将参数字符串作为行回显到stdout
- expr命令:间接更改sh变量的值
- 管道命令:通常使用管道作为过滤器
- 实用命令:除Linux外的其他实用实用程序作为命令。
例如:
axk:数据处理程序。 cmp:比较两个文件。 comm:选择两个排序文件共有的行。 grep:匹配一系列文件的模式。 diff:找出两个文件的差异。 join:通过使用相同的键来连接记录以比较两个文件。 sed:流或行编辑命令。 sort:排序或合并文件。 tail:打印某个文件的最后口行。 tr:一对一宇符翻译。 uniq:从文件中删除连续重复行。
- 内置命令
- 命令替换
- 在sh中,$A会被替换成A值,当遇到'cmd'或者$(cmd)时,会先执行cmd
示例:
echo $(data) echo $(ls dir)
- 在sh中,$A会被替换成A值,当遇到'cmd'或者$(cmd)时,会先执行cmd
- sh控制语句
- if-else-fi语句
if [condition] then statemates else statements fi
- if-elif-else-fi语句
if [condition];then commands elif [condition2];then commands else commands fi
- for语句
for VARIABLE in string1 string2 ... stringn do commands done
- while语句
while [condition] do commands done
- until-do语句
until [$ANS = "give up"] do echo -n "enter your answer" read ANS done
- case 语句
case $variable in pattern1) commands;; pattern2) commands;; patternn) commands;; esac
- I/O重定向
- 当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件
- I/O重定向有以下形式和含义
> file:stdout转向文件,如果文件不存在,将会创建文件 >> file:stdout追加到文件 < file:将文件用作stdin;文件必须存在并且具有r权限 << woed:从“here”文件中获取输入,直到只包含“word”的行
- sh函数
func() { # function code }
- sh中的通配符
*:可扩展到当前目录中的所有文件 ?:查询某文件名中的字符 []:查询文件名中一对[]中的字符
- 命令分组
- 使用{}或()对命令进行分组
- eval语句
- eval是sh的内置命令,由sh自己执行,不需要复刻新进程
eval [argl argl .. argn]
- sh在执行命令行前的步骤
- 参数替换
- 命令替换
- 通配符扩展
- eval是sh的内置命令,由sh自己执行,不需要复刻新进程
- 调试sh脚本
- sh脚本可由带有-x选项的子sh运行,以进行调试,如:
bash -x mysh
- sh脚本可由带有-x选项的子sh运行,以进行调试,如:
苏格拉底挑战
- sh内置命令
- sh控制语句
遇到的问题
- sh脚本怎么用
- GPT