# shell学习笔记 **Repository Path**: LingWuHome/shell-learn ## Basic Information - **Project Name**: shell学习笔记 - **Description**: 自己在B站,跟余超老师学习shell编程的代码例子与笔记 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-04-25 - **Last Updated**: 2024-08-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、介绍 1. 自己学习shell编程时的笔记,包含代码和随堂练习 # 二、创建编辑时间: ▂▂▂▂▂▂▂▂ 日期: 2022年04月25日🗓️ 农历: 虎🐅壬寅年三月廿五 时间: 18:32:22🕡 星期: 周一 # 三、代码记录 ## (一)、第一天代码 1.2022.04.27 21:02 2. 添加第二节例子 终端输出`echo` 语句使用 ## (二)、第一次代码 1. 2022.04.27 23:29 2. 添加第三节例子,脚本`shebang`的应用 ## (三)、第三次代码 1. 2022.04.28 13:20 2. 添加第二十三节,随堂练习代码,包含变量引用的常见格式区分 ## (四)、第四次代码 1. 2022.04.28 21:45 2. 添加第五节例子,和对历史`$HISTCONTROL`记录的方式进行补充 ## (五)、第五次代码 1. 2022.05.02 10:41 2. 添加第六节例子,对全局变量和局部变量以及父子`shell`进行验证 ## (六)、第六次代码 1. 2022.05.02 19:21 2. 添加第七节例子,不同的执行方式【`source`(`.`)和`bash`(`sh`),前者运行会保留到当前`shell`中,后者是开启子`shell`执行并不会保存到当前`shell`中】,和`pstree`查看进程树命令的使用,以及反引号的运用【保留命令执行后的结果】 ## (七)、第七次代码 1. 2022.05.02 22:32 2. 添加第八节例子,包含环境查看命令`set`、`env`、`declare`、`export`,和只读变量`readonly`设置 3. `set`和`declare`都输出所有变量,`env`用于输出环境变量,`export`显示和设置环境变量 4. `readonly`变量只有当`shell`进程结束时,才会失效 ## (八)、第八次代码 1. 2022.05.03 13:27 2. 添加第九节例子,包含一行多命令执行、环境变量加载顺序、使用`awk`和`export`命令进行环境变量的输出 ## (九)、进行错误验证 1. 2022年5月3日 16:52 2. 对变量定义时的单引号方式进行验证,还`read -p`参数使用 3. 结果: 变量单引号已解决,原因:因输入法原因打成中文单引号加代码没报错 `read -p` 参数使用,中蓝桥云环境并不能使用,原因也有可能是`zsh`的`shell`环境,待验证 ## (十)、 第九次代码 1. 2020年5月5日 13:19 2. 添加第十节代码例子,包含变量定义和特殊变量使用,`$n`,`$*`,`$@` ## (十一)、第十次代码 1. 2022.05.06 14:57 2. 添加第十一节代码例子,包含挂后台运行命令`nohup`,杀死后台运行程序指令`jobs`和`kill -9` 3. 以及对写入黑洞文件命令的相关补充和两种重定符的介绍 ## (十二)、第十一次代码 1. 2020.05.07 12:14 2. 添加第十二节代码例子,包含`echo`、`eval`、`exec`、`shell`子串花式用法 3. `shell`子串花式用法有待补充 ## (十三)、第十二次代码 1. 2020.05.07 15:19 2. 添加第十三节代码例子,接上节的`shell`子串花式用法 ## (十四)、第十三次代码 1. 2020.05.07 16:19 2. 添加第十四节和第十五节代码例子,主要是统计字数命令使用,包含:`wc`、`expr`、`awk`、`#` 3. 看命令的运行结果,对`awk`,`wc -L` 有待补充 ## (十五)、第十四次代码 1. 2020.05.08 17:39 2. 添加第十五节和第十六节例子,主要是对统计字数的命令进行计时,以确认内置命令的执行时间最短 ## (十六)、第十五次代码 1. 2020.05.09 11:46 2. 添加第十七节代码例子,主要为对字符串的删除,替换,截取输出的操作 ## (十七)、第十六次代码 1. 2020.05.09 13:38 2. 添加第十八节代码例子,主要是对前面知识运用,包含:`for`循环,反引号使用,`ls`查看包含指定字段的文件,`mv`移动和改名命令使用 3. 对`{1..100}`生成序列的部分有待补充 ## (十八)、第十七次代码 1. 2022.05.09 20:14 2. 添加第十九节代码例子,主要为四个扩展变量,分别为`${var:-word}`、`${var:=word}`、`${var:?word}`、`${var:+word}`; 3. 其中,`${var:-word}`与`${var:+word}`是相对的,前者为当`var`为空时,返回`word`字符串,后者为当`var`不为空时,返回`word`字符串 4. `${var:=word}`:为当`var`为空时,将`word`赋值给变量,并返回其值 5. `${var:?word}`:为当`var`为空时,将`word`当作错误信息进行返回,否则输出变量值;常用于设置变量为空时,返回的错误信息 6. 注意:这里的`var`和 `word`都是指变量名 ## (十九)、第十八次代码 1. 2020.05.10 09:55 2. 添加第二十节代码例子,内容是接上一节,主要是针对实践 3. 对`find` 的`mtime` 参数有待补充 ## (二十)、第十九次代码 1. 2020.05.10 13:30 2. 添加第二十一节代码例子,主要为脚本的不同运行,如:`source`和`.`方式是在当前shell环境中运行;`bash`、`./`和`sh`是开启子`shell`进行运行脚本 3. 可以通过`pstree`、`ps -ef`、`ps -ef --forest`查看当前`shell`所处位置 4. 直接`bash`开启子`shell`,可通过`exit`退出当前环境 5. 可以通过小括号来创建`shell` 列表执行命令,也可以再进行嵌套使用;可以通过`linux`默认变量`BASH_SUBSHELL`来查看当前`shell`所处位置,未开启子`shell`则输出0,反之则输出当前`shell`所处层级 ## (二十一)、第二十次代码 1. 2020.05.10 16:10 2. 添加第二十二节代码例子,主要内容为内置命令和外置命令的区别,和用`type` 命令进行验证 ## (二十二)、第二十一次代码 1. 2022.05.11 9:42 2. 添加第二十四节代码例子,主要为`shell`数学运算使用,演示了双小括号的使用 ## (二十三)、第二十二代码 1. 2022.05.11 13:34 2. 添加第二十五节代码例子,包含自加自减运算和对前面知识的应用 3. 使用函数和`if`语句,实现简单两个数的相加 ## (二十四)、第二十三次代码 1. 2022.05.11 14:49 2. 添加第二十六节代码例子,主要为`let`命令的简单使用 ## (二十五)、第二十四次代码 1. 2022.05.11 16:06 2. 添加第二十七节代码例子,主要是为检查`nginx`服务器是否存活,以及`wget`命令使用,还有`while`语句的使用 ## (二十六)、第二十五次代码 1. 2022.05.11 19:09 2. 添加第二十八节代码例子,主要为`expr`命令的简单使用,包含基本运算和模式匹配 ## (二十七)、第二十六次代码 1. 2022.05.12 11:27 2. 添加第二十九节代码例子,主要运用了`for`循环和`if`语句的使用 ## (二十八)、第二十七次代码 1. 2022.05.12 13:44 2.添加第三十节代码例子,主要为对计算命令的使用,包含:`bc`、`(())`、`expr`、`[]`、`awk`; 3. 其中还运用了`seq`和{1..number}来生成序列,`tr`命令来替换字符 4. `seq`命令生成指定分隔符的参数为`-s`,例子:`seq -s "+" 100` 5. `tr`替换命令例子:`echo {1..100} | tr " " "+"` ## (二十九)、第二十八次代码 1. 2022.05.12 14:41 2. 添加第三十一节代码例子,主要为`read`读取用户输入命令的使用,包含`-t`和`-p`参数,`-t`等待用户输入超时时间,`-p`为设置提示信息 ## (三十)、第二十九次代码 1. 2022.05.12 18:19 2. 添加第三十二节笔记,主要为`shell`条件测试,以`test`的参数为主 ## (三十一)、第三十次代码 1. 2022.05.13 7:50 2. 添加第三十三节代码例子,主要接上节的`test`命令的使用,在本节中使用了`-e`参数,进行判断对应的文件是否存在 ## (三十二)、第三十一次代码 1. 2022.05.13 9:08 2. 添加第三十四代码例子,主要为`test`命令的`-z`、`-n`、`-f`、`-d`参数使用 3. 待测试和补充部分:使用`test`命令的`-n`测试引用变量名(此时的变量为空,无字符)时有问题出现,具体原因不明,有待补充 - 原因已经找到:对变量进行测试时,必须添加双引号,就是变量的取值方式必须在双引号中,如:`[ -f "$filename" ]` ## (三十三)、第三十二次代码 1. 2022.05.13 13:16 2. 添加第三十五节代码一例子,主要为中括号和双中括号的条件判断测试,其中包含了`-n`、`-f`、`-d`、`-r`、`-w`、`-x`参数的使用 ## (三十四)、第三十三次代码 1. 2022.05.1316:38 2. 添加第三十六节笔记,如何阅读优秀脚本和对变量进行条件测试时必须添加双引号(`test -f "$filename"`) 3. 添加第三十七节代码例子,主要字符串比较使用,包含字符串的相等与不等,是否为空的情况 ## (三十五)、第三十四次代码 1. 2022.05.14 9:33 2. 添加第三十八节代码例子,主要为中括号和双中括号的条件判断使用,其中使用中括号进行条件判断时,数学比较符号需要进行转义操作,而双中括号则不需要。 3. 中括号、双中括号与`test`都支持两种方式的比较符,如:`!=`与`-ne`都是不等的意思 ## (三十六)、第三十五次代码 1. 2020.05.14 12:24 2. 添加第三十九节代码例子,主要为中括号与双中括号中的条件判断测试。 3. 在中括号中使用的条件判断符号为:`-a`(`and`与运算)、`-o`(`or`或运算)、`!`(非、进行取反) 4. 在双中括号、双小括号、以及`test`中的条件判断运算符为:`&&`(`and`与运算)、`||`(`or`或运算)、`!`(非,进行取反) ## (三十七)、第三十六次代码 1. 2022年5月14日 13:51 2. 添加第四十节代码例子,使用逻辑判断,对用户输入的数字进行简单的判断 ## (三十八)、第三十七次代码 1. 2022.05.14 16:19 2. 添加第四十一节代码例子,使用逻辑判断,模拟安装软件的例子 ## (三十九)、第三十八次代码 1. 2022.05.14 18:21 2. 添加第四十二节笔记,主要为`if`语法使用,包含单分支、双分支、多分支使用 ## (四十)、第三十九次代码 1. 2022.05.15 11:40 2. 添加第四十三节代码例子,使用条件判断对系统内存进行监测,使用了查看内存命令`free`和写入文件命令`tee` ## (四十一)、第四十次代码 1. 2022.05.15 12:40 2. 添加第四十四节代码例子,主要为对系统端口的检测,常用的命令有`netstat`、`ss`、`telnet`、`nmap`、`ps`等等 3. 此主要为对`MySQL`服务端口进行检测,因没装`MySQL`服务,因此代码例子还没进行验证 ## (四十二)、第四十一次代码 1. 2022.05.15 13:59 2. 添加第四十五节笔记,主要为通过`php`或`python`来连接`mysql` 3. 只记录了代码笔记,并未进行实践验证 ## (四十三)、第四十二次代码 1. 2022.05.15 16:00 2. 添加第四十六节笔记,主要为检测`mysql`是否存活运行的方法,在这节中共有五种方法 3. 因未安装`mysql`服务,只记录了代码笔记,未进行实践操作 ## (四十四)、第四十三次代码 1. 2022.05.16 11:44 2. 添加第四十七节代码,`rsync`服务的起停脚本。但并未运行脚本,生成日志 ## (四十五)、第四十四次代码 1. 2022.05.16 14:01 2. 添加第四十八节代码例子,主要为函数功能的使用,类似于`alias`起别名命令 ## (四十六)、第四十五次代码 1. 2022.05.16 14:43 2. 添加第四十九次笔记,主要内容为在`shell`中,函数的定义的方式和使用 ## (四十七)、第四十六次代码 1. 2022.05.16 15:14 2. 添加第五十节代码例子,主要内容为`shell`中函数的使用 ## (四十八)、第四十七次代码 1. 2022.05.16 16:03 2. 添加第五十一节代码例子,主要介绍了在`shell`中脚本的定义和运行是分开的 3. 在运行脚本中调用已经定义好的函数,以上此来执行脚本 ## (四十九)、第四十八次代码 1. 2022.05.16 16:33 2. 添加第五十二节代码例子,主要内容为`shell`函数参数传递的方法 3. 在所调用的函数,函数后面追加参数即可,如调用的函数名为`define_test`,传递参数时就是这么写的`define_test $1 $2 $3...` ## (五十)、第四十九次代码 1. 2022.05.17 10:38 2. 添加第五十三节代码例子,检测网站是否存活的例子,主要使用了`wget`命令 3. 美化代码部分在手机上未能成功运行,有待验证 ## (五十一)、第五十次代码 1. 2022.05.17 11:12 2. 添加第五十四节代码例子,`rsync`脚本开发例子,因含美化代码,未能成功运行,有待验证 3. 这节和上一节都报了这个错误`beautify_check_url_func_demo.sh:63: parse error near `\n'`具体原因有待解决