从零开始的Linux学习
2020.5.9-第五天
碎碎念:讲完vim编辑器,就直接教shell脚本编写了,感觉还蛮快的,虽然已经大致看得出是什么意思了,但要自己真正写出一个脚本,那还挺难的。
一、Vim编辑器
vim文本编辑器(需要着色就使用vim,不需要的时候就使用vi):
有三种模式:
命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作(默认进入);
输入模式:正常的文本录入(a键:光标后一位;i键:光标当前位置;o键:光标的下面创建一个空行);
末行模式:保存或退出文档,以及设置编辑环境。
vim常用命令:
(ndd:删除(剪切)从光标处开始的n行
nyy:复制从光标处开始的n行)
末行模式下可用的命令:
二、编写shell脚本
1.Shell脚本命令的工作方式有两种:交互式和批处理:
a.交互式(Interactive):用户每输入一条命令就立即执行。
b.批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。
完整的Shell脚本由三部分组成:
a.脚本的声明("#!“开头-#!/bin/bash)
b.脚本的注释(”#"开头,任何加在#后面的数据将全部被视为注释文字而被忽略)
c.脚本的命令
执行Shell脚本的方式:
A.直接命令执行:shell.sh文件必须要具备可读与可执行(rx)的权限,然后:
a.绝对路径:使用/home/d,tsal/shell.sh来执行命令;
b.相对路径:假设工作目录在/home/dmtsai/,则使用./shell.sh来执行;
c.变量【PATH】功能:将shell.sh放在PATH指定的目录内,例如:~/bin;
B.以bash程序来执行:通过【bash shell.sh】或【sh shell.sh】来执行。
(可以通过“cat /etc/shells”文件来查看系统有哪些shell)
2.接受用户参数,例:
“$”指的是提取出变量的值,
0
对
应
的
是
当
前
S
h
e
l
l
脚
本
程
序
的
名
称
,
0对应的是当前Shell脚本程序的名称,
0对应的是当前Shell脚本程序的名称,#对应的是总共有几个参数,
∗
对
应
的
是
所
有
位
置
的
参
数
值
,
*对应的是所有位置的参数值,
∗对应的是所有位置的参数值,?对应的是显示上一次命令的执行返回值(一般来讲,正确值为0,错误值为非0数值),而$1、$2、$3……则分别对应着第N个位置的参数值。
3.判断用户参数,按照测试对象来划分,条件测试语句可以分为4种:
A.文件测试语句,即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符:
使用“[ ]”时,命令两边需要打上空格;
B.逻辑测试语句,用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果($?对应的是显示上一次命令的执行返回值(一般来讲,正确值为0,错误值为非0数值)):
a.逻辑“与”的运算符号“&&”:表示当前面的命令执行成功后才会执行它后面的命令;
b.逻辑“或”的运算符号“||”:表示当前面的命令执行失败后才会执行它后面的命令;
前者是在root帐号下,“[ $USER = root]”是能输出正确结果的,接着“&&”符号,也就跟着输出后面的内容,“||”后的内容便不输出;
而后者因为是切换了用户不再是root,所以“[ $USER = root]”输出失败,所以“ [ $USER = root ] && echo “admin””输出失败,所以“||”后的内容可以输出;
c.逻辑“非”的运算符号“!”:表示把条件测试中的判断结果取相反值;
“[ $USER = root ]” 判断是否为root用户,
“[ ! $USER = root ]”判断是否为非root用户,
("[ ! -e ] &&" 表示在前面不存在时再去执行后面的命令)
C.整数值比较语句,仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然地使用日常生活中的等号、大于号、小于号等来判断(因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。因此一定要使用规范的整数比较运算符来进行操作,且使用“>”或“<”转义之后,还是只能用于字符的判断,不能用于数值判断):
因为产生了歧义,所以要比较
的时候,需要用到以下参数
检查内存的可用量的脚本命令:“free -m”以MB为单位查看内存使用量,“grep Mem | awk '{print $4}”选出物理内存这一行的第四列数字(内存可用量情况),“free -m | grep Mem | awk '{print $4}'
”以MB为单位的内存可用量情况(数值),再与1024作比较(-lt 小于 );
D.字符串比较(变量比较)语句,用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值):
三、流程控制语句(if、for、while、case)
1.if条件测试语句(常见有if…then),if条件测试语句可以让脚本根据实际情况自动执行相应的命令。从技术角度来讲,if语句分为单分支结构、双分支结构、多分支结构,其复杂度随着灵活度一起逐级上升:
a.单分支结构,if条件语句的单分支结构由if、then、fi关键词组成,而且只在条件成立后才执行预设的命令,相当于口语的“如果……那么……”。单分支的if语句属于最简单的一种条件判断结构:
首先,“if”先判断该文件是否存在,“then”如果不存在则创建该文件,“fi”结束。
b.双分支结构,由if、then、else、fi关键词组成,它进行一次条件匹配判断,如果与条件匹配,则去执行相应的预设命令;反之则去执行不匹配时的预设命令,相当于口语的“如果……那么……或者……那么……”:
(/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。)
c.多分支结构,由if、then、else、elif、fi关键词组成,它进行多次条件匹配判断,这多次判断中的任何一项在匹配成功后都会执行相应的预设命令,相当于口语的“如果……那么……如果……那么……”:
read命令是读取用户输入的值来复制给“GRADE”变量,参数“-p”是添加提示信息,
大于等于(-ge)85且小于等于(-le)100输出Excellent,
大于等于(-ge)70且小于等于(-le)84输出Pass,
否则输出Fail,所以超过100或者低于70的数值都是会出现Fail:
else if(elif)可使用多次,else包含无穷数值,但字母不能输出,不然会报错。