一:编写一个HelloWorld脚本
- 脚本如下
a:首先我们在/opt/shellTest路径下创建一个helloworld.sh脚本
b:内容
c:我们在指定脚本的时候要注意是否存在执行的权限
d:执行效果
二:多命令处理
- 需求:
在/opt/shellTest路径下创建一个test.txt文件,并且在文件中添加test shell内容。 - 首先我们在/opt/shellTest路径下创建一个test1.sh脚本,并且在脚本里面添加内容
执行效果:
三:Shell中的变量
- 自定义变量(一定要注意,定义变量的时候等于号左右不能存在空格)
- 撤销变量,使用unset
- 声明静态只读变量,readonly变量,这样就不能使用unset撤销了,也无法修改值
- 变量定义规则
变量名称可以由字母,数字,和下划线组成,但是不能以数字开头,环境变量名称建议大写。
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
变量的值如果有空格,需要使用单引号或双引号括起来。 - 可以把变量提升为全局变量,可供其他shell程序使用。
a:首先定义一个变量
b:使用export提升为全局变量
c:在脚本中使用这个全局变量
四:特殊变量$n
- 语法简介
$n,n为数字,$0代表的是该脚本名称,$1-$9代表的是第一到第九个参数,十以上的参数需要使用大括号包含,
如:${10} - 实例
a:需求,输出脚本的名称,以及输入参数1和输入参数2的值。
b:创建脚本
c:效果
五:特殊变量$#
- 简介
用于获取所有输入参数个数,常用语循环。 - 实例,获取输入参数的个数
a:创建test4.sh脚本,使用${#}获取输入参数的个数
b:调用效果
六:特殊变量$*
- 基本语法
这个变量代表的是命令行中所有的参数,$*把所有的参数看成一个整体
七:特殊变量$@
- 基本语法
这个变量代表的是命令行中所有的参数,不过$@把每个参数区分对待
八:特殊变量$?
- 基本语法
表示最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行,
如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行
不正确了。 - 实例,我们执行一下helloworld.sh脚本
九:运算符
- 基本语法
"$((运算式))"或者"$[运算式]" - 加减乘除(注意:expr运算符间要有空格)
expr + --->表示加
expr - --->表示减
expr \* --->表示乘
expr / --->表示除
expr % --->表示取余 - 实例一,计算3加2的值(下面可以发现只有+号两边加上空格才行)
- 实例二:计算3加2再乘以4
- 采用$[运算式]方式
十:条件判断
- 基本语法
[ condition ] :注意,condition前后要有空格,条件非空几位true,比如:[ aa ]返回true, []返回false - 常用的判断条件
a:两个整数直接的判断
b:按照文件权限进行判断
c:按照文件类型进行判断
- 判断22是否大于23
- 判断helloworld.sh是否具有写的权限
- 判断文件是否存在
- 多条件判断
a:&&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令。
b:实例
十一:if判断
- if判断
⑴基本语法
if [ 条件判断 ];then
程序
fi
或者如下:
if [ 条件判断 ]
then
程序
fi
(注意事项:
a: [ 条件判断 ], 中括号和条件判断直接必须有空格
b:if 后面要有空格
)
⑵实例,输入一个数字,如果是1,则输出 “aaaaa”,如果是2,则输出“bbbbbb”,如果是其他什么都不输出。
a:创建test5.sh脚本
b:内容
c:效果
十二:case语句
- case基本语法
- 案例如下
⑴:需求,输入一个数字,如果是1,则输出aaa,如果是2,则输出bbb,如果是其它,则输出ccc
a:创建test6.sh文件
b:test6.sh内容
c:效果
十三:for循环
- 基本语法
- 案例,需求:从1加到100
a:创建test7.sh
b:内容
c:效果(结果等于5050是对的)
-
语法2
-
案例,打印所有的输入参数
a:创建test8.sh文件
b:内容如下,上面的运算符提到过$*是接收所有参数的,这里我们也是可以使用$@的,也可以接收所有参数
c:效果
d:注意,我们这里也是可以使用$*将循环变成一个整体的,而$@是没有这个功能的
效果如下:
十四:while循环
- 基本语法
- 案例,从1加到100
a:创建test9.sh,内容如下
b:效果如下,总数为5050
十五:read读取控制台的输入
- 基本语法
- 案例:提示7秒内,读取控制台输入的名称
a:创建read.sh文件,内容如下
b:效果
十六:系统函数
- basename函数用法(主要用来获取文件的名称的)
a:案例,截取/opt/shellTest/test9.sh文件的文件名称
如果我们想获取的只是文件名称,后缀也不要,如下:
- dirname函数用法(主要用来获取文件的路径的)
a:案例
十七:自定义函数
- 基本语法
- 案例:计算两个输入参数的和
a:创建一个test10.sh文件
b:内容如下
效果:
十八:Shell工具
- cut
⑴简介
⑵基本用法
⑶案例,先我们存在一个文件cut.txt,内容如下
a:要求,我们现在想要获取cut.txt文件中的第一列数据
命令:cut -d " " -f 1 cut.txt 因为每行两个字之间是空格,所以我们以空格作为切割条件,截取第一列数据。
b:要求,我们将cut.txt文件中的hai字截取出来
命令:cat cut.txt | grep hai | cut -d " " -f 1
cat cut.txt 表示展示cut.txt内容
grep hai 表示按照hai字进行分组
cut -d " " -f 1 以空格进行分割截取第一列
⑷案例,获取系统变量PATH变量值第二个“:”(冒号)开始后的所有路径
命令:echo $PATH | cut -d : -f 3-
echo $PATH 表示展示PATH变量值
cut -d : -f 3- 表示截取以冒号为分割的第三列之后所有的内容(3-表示第三列后所有的数据)
⑸切割ifconfig后打印的IP地址
命令:ifconfig ens32 | grep "inet " | cut -d " " -f 10 - sed
⑴简介
⑵基本语法
⑶案例,数据准备sed.txt
a:需求,将“mei nv” 这个单词插入到sed.txt第二行下,打印
命令:sed "2a mei nv" sed.txt 表示在sed.txt文件的第二行下面增加一行数据mei nv
b:需求,删除sed.txt文件中所有包含"hai"的行
命令: sed "/hai/d" sed.txt
/hai/ 表示所有包含hai的行
d 表示删除
c:需求,将sed.txt文件中所有的wo替换成ni
命令:sed "s/wo/ni/g" sed.txt
s 表示查找并替换
s/wo/ni/ 表示查找wo并且替换成ni
g 表示global,全部替换
d:将sed.txt文件中的第二行删除并且将wo替换为ni
命令:sed -e "2d" -e "s/wo/ni/g" sed.txt
-e "2d" 表示先删除第二行
-e "s/wo/ni/g" 表示再将所有的wo替换成ni - awk
⑴简介
⑵数据准备
⑶需求,搜索passwd文件以root关键字开头的所有行,并输出该行的第7列
⑷需求:搜索passwd文件以root关键字开头的所有行,并输出该行的第一列和第七列,中间以“,”号分割。
⑸需求:只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名“user,shell”,在最后
一行添加“gogogo”
命令:awk -F ':' 'BEGIN{print "user,shell"}{print $1","$7} END{print "gogogo"}' passwd