shell脚本
简单说shell脚本是为了实现某业务功能的linux命令的集合,shell脚本文件就是存放这些Linux命令集合的文件,为了与普通文件进行区分,shell脚本文件一般使用.sh结尾;执行shell脚本有2种方式,可以通过bash xx.sh或者在命令行中直接输入shell脚本文件的绝对路径来执行脚本。
shell脚本内容的格式是固定的,如下是打印当前目录列表的简单shell脚本,这个shell脚本主要包含三部分,第一行(#!)是声明使用哪种解释器来执行shell脚本;第二行(#)是注释信息,从第三行开始就是linux命令集合了,用于实现业务功能。
#!/bin/bash
#For Example
pwd
ls -al
shell脚本接收参数
$* :接收到的参数都有哪些
$# :接收参数的个数
$0 :shell脚本名称
$1、$2、$3 :第1、2、3个参数
使用测试语句判断用户输入的参数
测试语句主要用于判断用户输入的参数,这里虽然也使用中括号,但跟通配符的中括号是两码事儿,判断语句里的中括号格式要求比较严格,语句两边必须使用空格;返回结果使用变量$?进行查看,返回值0表示条件为真,非0表示条件为假:
根据判断对象的不同,测试语句可以分为4种
文件测试语句;
逻辑测试语句;
整数值比较语句;
字符串比较语句。
文件测试语句
主要用于测试某文件是否存在、类型是目录还普通文件、rwx权限这些
逻辑测试语句
每次使用变量$?查看测试语句返回值太麻烦了,可使用逻辑符号将返回结果做一个简单的判断直接进行输出
&& 前面命令执行成功,则执行后面的语句
|| 前面命令执行失败,则执行后面的语句
! 取反
用例:判断当前用户是管理员还是普通用户
整数值比较语句
对整数进行比较时就要注意了,这里必须使用转义符号,因为>、<、=分别会与输出重定向、输入重定向、赋值符发生冲突
用例:内存小于10MB时发送报警消息
使用free查看内存情况
使用grep搜索内存行
使用awk结合正则提取内存列,此处不使用cut是因为free执行结果中无法确认列的分隔符是什么
可以使用整数测试语句、逻辑测试语句进行优化
字符串判断语句
用例:判断某个变量是否被使用了,避免覆盖其他用户的变量
-z :字符串比较,判断变量值(字符串)是否为空值
流程控制语句
在shell中输入的命令一般是按照由上到下的顺序依次运行,当然在使用逻辑符进行条件判断时实现了简单的真假条件分支,其实在linux中还提供了编程语言中对应的if条件判断、for条件循环、while条件循环、case条件语句,实现的功能与编程语言是一样的,但在shell中的格式与编程语言还是有很大区别的
条件测试if
支持单分支、双分支、多分支
单分支格式
用例:判断指定目录是否存在,如不存在则创建该目录
双分支格式
用例:ping某地址是否在线
扩展:黑洞文件/dev/null,可以将不想显示在屏幕的信息导入到/dev/null文件里面
多分支
用例:判断成绩等级
扩展:实现交互式输入参数,使用read命令实现交互式时将用户输入值赋值给某变量,使用参数-p在交互过程中显示提示信息
循环for
根据范围进行循环
用例:批量创建多个用户,用户名称存储在user.txt里面
扩展:声明变量时不需要符号$,使用变量值的时候需要使用符号$
shell中的变量不需要声明,直接拿来使用
passwd命令的--stdin参数,用于接收管道符传递的参数作为passwd的密码参数
用例:批量判断ip是否在线,ip保存在ip.txt里面
循环while
根据条件循环
用例:猜价格
扩展:$RANDOM:随机数
expr :计算公式,因为在shell中是不区分变量的数据类型的,比如在shell中出现512,bash并不清楚这是数字还是字符串,使用expr命令达到表达式计算的目的;
let TIMES++ :let命令在此处的作用类似于编程语言中的 i++,此处可以直接写TIMES=`expr $TIMES + 1`
exit :表示退出循环还是程序?
用例:exit 0 表示退出程序,而不只是退出循环
运行结果
case判断语句
case与多分支if判断非常类似,case格式要求与编程语言中的switch case格式区别太大了(吐槽吐槽!)
格式要求:判断条件只有右括号,没有左括号
格式要求:每个判断结束条件需要使用双分号结束,但最后一个判断条件后边却没有双分号
在case中的条件或并不是符号"||"而是"|"
用例:判断数据的类型