第1章 shell基础
1.1 什么是shell
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出屏幕返回给用户。
1.1.1 shell对话方式
交互的方式:从键盘输入命令,通过/bin/bash的解析,可以立即得到Shell的回应,一问一答的方式
非交互式:shell脚本
1.2 为什么使用shell编程
作为一个合格的运维人员必须掌握一种或一种以上的脚本语言,shell编程则是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,可以把繁琐重复的命令写到shell脚本中执行,节约时间,有效的提高运维人员的工作效率,减少不必要的重复工作时间。
1.3 系统中的shell
linux系统默认shell是bash
[root@zeq ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh
第2章 变量
2.1 什么是变量
x+y=20 x=10 y=? 未知数(变量)
一个未知数,随时可以变化的量叫变量
2.2 变量的分类
2.2.1 普通变量(局部变量)
只能在当前环境下使用,可以通过export命令临时把普通变量变为环境变量使用
[root@zeq ~]# ip=10.0.0.201 给变量赋值(把数据存放到变量中) [root@zeq ~]# echo $ip 10.0.0.201
2.2.2 环境变量(全局变量)
1.大写
2.系统定义的
3.在大部分地方可以使用
2.2.3 特殊变量
$1 $2 $数字 $后数字是几代表shell脚本第几个参数
$# shell脚本中参数的个数
判断脚本的参数个数
$? 上一个命令的执行结果(返回值)
0 执行正确
非0 执行失败
$0 脚本文件名
第3章 shell脚本的书写规范
3.1.1 脚本存放位置
为了防止脚本乱放,统一存放在/server/scripts/中
创建目录
[root@zeq ~]# mkdir -p /server/scripts/ [root@zeq ~]# cd /server/scripts/
3.1.2 脚本编辑使用vim
3.1.3 选择解释器
在执行bash脚本的时候,内核会根据"#!"后的解释器来确定该用那个程序解释这个脚本中的内容。
[root@zeq ~]# vim /server/scripts/cal.sh #!/bin/bash
3.1.4 文件名书写
文件名称一定要有意义,方便看出是干嘛用的脚本,并且以.sh结尾
3.1.5 书写脚本的规范和习惯
1、 放在统一目录下,方便查找
2、 书写脚本要用vim编辑,
批量删除
批量增加
1.进入批量编辑模式(可视块)esc下ctrl+v
2.选择 批量增加的范围
3.按 shift + i 进行修改
4.按esc 退出等等
3、 脚本文件名称以.sh结束
4、 脚本开头一定要指定解释器
5、 脚本中#代表注释,#后的内容不会执行,不用的命令等可以用#注释掉,脚本中尽量不要出现中文注释以免出现因字符集不同产生乱码
6、 代码符号书写规范
1.成对的符号一定要都写出来再添加内容,避免遗忘漏写;如 "" '' []等
2.流程控制语句一次书写完,再添加内容;(if 条件 ; then 内容;fi)
3.书写的代码符号都是英文输入法格式
4.通过缩进让代码易读
第4章 shell练习
书写一个计算器脚本
4.1 数字计算方法
[root@zeq ~]# awk 'BEGIN{print 1/2}' 0.5
4.1.1 命令行中的变量 放在awk中使用
awk -v变量=赋值 变量名称自己定义
[root@zeq ~]# awk -vnum1=10 -vnum2=20 'BEGIN{print num1/num2 }' 这里变量为num1和num2 0.5
4.1.2 书写脚本计算10与20的加减乘除
[root@zeq]# vim cal.sh #!/bin/bash n1=10 n2=20 awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
执行脚本
[root@zeq /server/scripts]# sh cal.sh 30 -10 200 0.5
4.1.3 定义特殊变量 通过命令行传递参数方式进行计算
[root@zeq /server/scripts]# vim cal.sh #!/bin/bash n1=$1 第一个参数 n2=$2 第二个参数 awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
[root@zeq /server/scripts]# sh cal.sh 10 20 后面要跟上两个参数才能执行成功,参数之前加空格 30 -10 200 0.5
4.2 通过read 交互式
read交互式赋予变量内容
read -p "提示信息:" 变量名字
read -p "提示信息:" p
执行之后会把输入的信息存放在变量中
[root@zeq /server/scripts]# read -p "input num1:" n1 input num1:zeq [root@zeq /server/scripts]# echo $n1 zeq
4.2.1 通过read命令实现 n1 n2赋值 进行计算
[root@zeq /server/scripts]# vim cal.read.sh #!/bin/bash read -p "input num1,num2:" n1 n2 一条命令直接定义两个变量 awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
执行脚本
[root@zeq /server/scripts]# sh cal.read.sh input num1,num2:10 20 随便输入两个数值,中间要有空格 30 -10 200 0.5
4.3 条件表达式 if
4.3.1 判断目录、文件是否存在
[ -d /data ]
[ -f /data ]
注意格式:[空格-f /data空格] []里面两端必须有空格,中间写内容
[root@zeq /server/scripts]# [ -d /data ] [root@zeq /server/scripts]# echo $? $?特殊变量,0代表执行正确,非0执行失败 0 [root@zeq /server/scripts]# [ -d /data123 ] [root@zeq /server/scripts]# echo $? 1
4.3.2 比大小
-eq equal ==
-ne not equal !=
-gt great than >
-ge great equal >=
-lt less than <
-le less equal <=
4.3.3 比大小举例
[root@zeq /server/scripts]# [ 10 -eq 10 ] [root@zeq /server/scripts]# echo $? 0 [root@zeq /server/scripts]# [ 10 -gt 10 ] [root@zeq /server/scripts]# echo $? 1 [root@zeq /server/scripts]# [ 10 -ge 10 ] [root@zeq /server/scripts]# echo $? 0
4.3.4 if单分支格式脚本
格式: if [ 条件 ];then
命令
fi
1、判断脚本的参数个数,如果不是2则提示请输入两个数字
[root@zeq /server/scripts]# cat pan.sh #!/bin/bash if [ $# -ne 2 ];then echo "输入两个数字" fi
2、 给计算器(参数传递)增加一个条件
判断脚本的参数个数,
如果不是2则
提示请输入两个数字
[root@zeq /server/scripts]# cat cal.sh #!/bin/bash n1=$1 n2=$2 if [ $# -ne 2 ];then echo "USAGE: $0 num1 num2" $0文件名 exit exit 退出的意思 fi awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1+num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1-num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1*num2 }' awk -vnum1=$n1 -vnum2=$n2 'BEGIN{print num1/num2 }'
3、执行脚本
[root@zeq /server/scripts]# sh cal.sh USAGE: cal.sh num1 num2 [root@zeq /server/scripts]# sh cal.sh 120 20 140 100 2400 6
4.3.5 if双分支格式脚本
格式: if [ 条件 ];then
命令
else
命令
fi
1、comp.sh输入两个数字:
1.如果n1大于n2
输出 n1 > n2
2.如果n1不大于n2
输出 n1 <= n2
[root@zeq /server/scripts]# cat comp.sh #!/bin/bash n1=$1 n2=$2 if [ $n1 -gt $n2 ];then echo "$n1 > $n2" else echo "$n1 <= $n2" fi
2、执行脚本
[root@zeq /server/scripts]# sh comp.sh 10 20 10 <= 20 [root@zeq /server/scripts]# sh comp.sh 10 10 10 <= 10 [root@zeq /server/scripts]# sh comp.sh 100 10 100 > 10