第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 $ip10.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和num20.5
4.1.2 书写脚本计算10与20的加减乘除
[root@zeq]# vim cal.sh#!/bin/bash n1=10n2=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.sh30 -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:" n1input num1:zeq [root@zeq /server/scripts]# echo $n1zeq
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.shinput 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=$1n2=$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.shUSAGE: cal.sh num1 num2 [root@zeq /server/scripts]# sh cal.sh 120 20140 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=$1n2=$2 if [ $n1 -gt $n2 ];then echo "$n1 > $n2"else echo "$n1 <= $n2"fi
2、执行脚本
[root@zeq /server/scripts]# sh comp.sh 10 2010 <= 20[root@zeq /server/scripts]# sh comp.sh 10 1010 <= 10[root@zeq /server/scripts]# sh comp.sh 100 10100 > 10
作者:张恩清 本人微博:https://weibo.com/5628470434/ 本人小白,博客内容均为原创,欢迎大家转载以及纠正错误,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文出处:https://www.cnblogs.com/zeq912/p/9501915.html