一、 简单介绍shelll
1.为什么要学习shell
- ? 提高工作效率
- ? 自动化管理
- ? 减少重复的工作
- ? 安装操作系统
- ? 系统优化 SSH 关闭SElinux 关闭iptables 内核参数优化等
- ? 安装服务
- ? 服务的配置
- ? 启动服务
- ? 日志统计(三剑客)、日志切割,ELK
- ? 监控zabbix cacti流量 nagions 交换路由
2.学习shell 编程所掌握的基础知识
- 常用的Linux基础命令
- 熟练掌握vim 多练
- 三剑客(sed grep awk)
例如:
查找当前目录下的所有文件
[root@rac19c1 zmysh]$find . -type f
[root@rac19c1 ini]$ll -R | grep ^-
查Ip
[root@rac19c1 ini]$ip add |grep eth0 |awk 'NR==2{print $2}'
10.0.0.200/8
3.如何学好shell编程
- 环境变量基础知识
- if判断
- for循环
- while循环
- case语句
- 函数
- 数组
- 流程控制语句 continue break exit
基础语法必须掌握,自己总结,不断的练习
4.shell脚本初步入门
1.什么是shell
命令解释器,解释我们输入的命令或者脚本。
**交互式模式:**终端等待我们输入命令,输入命令,执行我们所输入的命令并且把结果反馈给我们,关闭终端,终端
非交互模式: 他会去执行我们所写好的命令放入到文本里。执行到最后一条,shell退出。
2.什么 是shell脚本
把能在命令执行的命令放在一个文件里,这就是shell脚本。包含了判断语句,循环语句,数组函数等待。
3.创建shell脚本规范
1.脚本必须放在同一个目录/server/scripts
2.脚本的开头必须写解释器
3.脚本名称的结尾必须以.sh结尾
4.脚本中写注释作者的名字创建时间 Author lzy create time 2018.11.26
5.成对的符号一次性书写完毕 “” ‘’ {} [] ``
6.循环语句一次性书写完毕 for i in ;do ;done
7.注释尽量不使用中文
8.内容缩进
例如:
#Author zmy
#create time 2018.11.26
#cut log
#qq 邮件
二、shell变量核心基础知识
1.什么是变量
x=1 y+x=1 x变量名 =赋值 变量的值
永久性环境变量: /etc/profile
临时新环境变量 : export 直接声明
2.自定义环境变量
包含了字母、下划线和数字,建议以字母或者下划线开头,等号两边不能有空格,见名字知其意
如:
zmy_age=18 第一种写法
Zmy_Age=18 大驼峰
zmy_Age=18 小驼峰
ZMY_AGE=18 全部大写
3.三种变量定义方式
1.字符串如何定义 zmy=“test” 默认加双引号
2.数字如何定义 zmy=18
3.命令如何定义 zmy=date zmy=$(date)
4.shell脚本的重要位置参数
$0 | 脚本的名称,则获取的是全路径名称 加上basename 就不会显示 |
---|
$n | 脚本的第几个参数 | $# | 获取脚本传参的总个数 | $* | 获取脚本的所有参数,如果不加双引号和$@相同,如果加上双引号,获取的是一个整体 | $@ | 获取传参的所有参数,如果不加双引号和$*相同,如果加上双引号,则获取的为单个参数 | $? | 上一条命令的执行结果,0成功,非0失败 | $$ | 获取脚本的PID,当系统执行多个shell脚本时使用 | $! | 获取上一个脚本的PID |
例1:$0 $n的用法
脚本
# !/bin/sh
zmy=test
echo $zmy is ok
echo $0
echo $1 $2 $3
echo $#
~
运行结果 $0当前脚本所在位置 $1 1个参数 $2 两个参数 $3 3个参数
[root@zmy test]$sh test.sh zmy ltt ta
test is ok
test.sh
zmy ltt ta
3
例2:$#的用法
脚本:
# !/bin/sh
zmy=test
if [ $# -ne 2 ];then
echo "USAGE: $0 参数1 参数2 "
exit 1
fi
echo $zmy is ok
echo $0
echo $1 $2 $3
echo $#
结果:
[root@zmy test]$sh test.sh
USAGE: test.sh 参数1 参数2
[root@zmy test]$sh test.sh 1 2
test is ok
test.sh
1 2
注意: exit 1 是为了方便程序出错时 echo $? 可以快速定位到是那一个判断语句出现问题。
例3
?
和
*和
?和@的区别
set – "I am " zhengmingyu teacher 模拟传参
[root@zmy test]$set -- "I am " zhengmingyu teacher
[root@zmy test]$for i in $* ; do echo $i ;done
I
am
zhengmingyu
teacher
[root@zmy test]$for i in $@ ; do echo $i ;done
I
am
zhengmingyu
teacher
结果 : 不加双引号是相同的
加双引号:
[root@zmy test]$for i in "$*" ; do echo $i ;done
I am zhengmingyu teacher
[root@zmy test]$for i in "$@" ; do echo $i ;done
I am
zhengmingyu
teacher
结果: 加双引号
?
会
把
所
有
参
数
当
成
一
个
整
体
输
出
,
* 会把所有参数当成一个整体输出,
?会把所有参数当成一个整体输出,@是一个参数一个参数输出
例4 $? 在脚本中的用法
#! /bin/sh
ping -c 1 www.baidu.com &>/dev/null
if [ $? -ne 0 ];then
echo "网络不通"
else
echo "网络通畅"
fi
sh -x 脚本 可以看到脚本的执行过程
例5: $$ 获取脚本的PID
脚本:
[root@zmy test]$vim test.sh
# !/bin/sh
zmy=test
echo $zmy is ok
echo $0
echo $1 $2
echo $$
sleep 60
echo $#
结果:
[root@zmy test]$sh test.sh
test is ok
test.sh
16020
0
[root@zmy ~]$ps -aux |grep 16020
root 16020 0.0 0.0 113284 1208 pts/4 S+ 16:26 0:00 sh test.sh
root 16063 0.0 0.0 112824 988 pts/0 R+ 16:26 0:00 grep --color=auto 16020
5.shell 变量传参
1.read -p “” 参数
第一种变量传参 单个参数:
# !/bin/sh
read -p "please input num: " a
echo $a
结果:
[root@zmy ~]$sh test3.sh
please input num: zmy
zmy
多个参数空格隔开
[root@zmy ~]$vim test3.sh
# !/bin/sh
read -p "please input num: " a b
echo $a
echo $b
结果
[root@zmy ~]$sh test3.sh 2 3
please input num: 2 3
2
3
2.第二种变量传参
#---第二种变量传参-----------
c=$1
d=$2
echo $1
echo $2
结果:
[root@zmy ~]$sh test3.sh zmy ltt
zmy
ltt
3.第三种变量传参
echo $1 $2
6.变量的字串删除和替换
变量切片
[root@zmy ~]$name="zmy is teacher"
[root@zmy ~]$echo $name
zmy is teacher
[root@zmy ~]$echo ${#name} #显示长度
14
[root@zmy ~]$echo ${name:1} 后面跟数字就是剪切第几位
my is teacher
[root@zmy ~]$echo ${name:2}
y is teacher
[root@zmy ~]$echo ${name:2:2} 剪切前2位到后两位
y
[root@zmy ~]$echo ${name:2:3}
y i
扩展1:wc -L 取变量的长度
[root@zmy ~]$echo ${name}|wc -L
14
扩展2:awk 取变量的长度
[root@zmy ~]$echo ${name}|awk '{print length}'
14
取小于长度3的字符串
方法 一
[root@zmy ~]$echo $name |xargs -n1|awk '{if(length<3) print}'
is
方法二
[root@zmy ~]$vim test4.sh
1 # !/bin/sh
2 for i in zmy is teacher
3 do
4 if [ ${#i} -lt 3 ]; then
5 echo $i
6 fi
7 done
#切片
两个##表示贪婪匹配
从前面往后面删除变量内容
[root@zmy ~]$url=www.sina.com.cn
[root@zmy ~]$echo ${url#*.}
sina.com.cn
[root@zmy ~]$echo ${url##*.}
cn
从后面往前删除环境变量
[root@zmy ~]$echo ${url%.*}
www.sina.com
[root@zmy ~]$echo ${url%%.*}
www
7.字符串替换
[root@zmy server]#: echo ${url/com/zmy}
www.baidu.zmy
//贪婪匹配
[root@zmy server]#: echo ${url//w/d}
ddd.baidu.com.cn
8.变量自增
[root@zmy server]#: a=1
[root@zmy server]#: b=1
[root@zmy server]#: let c=a++ # a++ 先执行后执行+1操作。 ++a:++a先执行加1操作。
[root@zmy server]#: let d=++b
[root@zmy server]#: echo $c
1
[root@zmy server]#: echo $d
2
[root@zmy server]#: let x=a+1
[root@zmy server]#: echo $x #因为a自增过一次 所以是3
3
案例:使用脚本进行变量自增
脚本
#!bin/sh
IP=192.168.182.129
i=1
while [ $i -le 3 ]
do
ping -c 1 $IP &>/dev/null
if [ $? -eq 0 ] ;then
echo "$IP is ok "
fi
let i++
done
运行结果:
[root@zmy script]#: sh IpTest.sh
192.168.182.129 is ok
192.168.182.129 is ok
192.168.182.129 is ok
9.数值运算
1.交给bc运算
yum -y install bc 支持小数运算
[root@zmy script]#: echo 1+2|bc
3
2.expr用法
[root@zmy script]#: expr 1 + 2
3
[root@zmy script]#: expr 1 \* 2
2
*注意: 1 2之间必须有空格 需要转义
也可以用$取值运算
[root@zmy script]#: a=1
[root@zmy script]#: b=2
[root@zmy script]#: echo $a+$b|bc
3
[root@zmy script]#: expr $a + $b
3
3.(())运算 只支持整数运算
[root@zmy script]#: echo $((1+2))
3
注意:echo $[1+2] 和(())一样 但是效率没有(())的高
取随机数1-100之间
[root@zmy script]#: echo $((RANDOM%100+1))
70
4.let运算
[root@zmy script]#: let sum=1+1
[root@zmy script]#: echo $sum
2
5.awk数值运算
支持小数运算
[root@zmy script]#: awk BEGIN'{print 1+2}'
3
[root@zmy script]#: echo 1 2|awk '{print $1+$2}'
3
[root@zmy script]#: awk BEGIN'{print 1.2*2}'
2.4
三、shell条件测试
1.test文件测试
[ -e dirfile ]存在则为真
[ -d dir ]目录是否存在
[ -f file ]文件是否存在
[ -x file ]文件是否具有可执行权限
[ -w file ]文件是否具有写权限
常用测试:
[root@zmy script]#: [ -f /etc/passwd ] && echo ok ||echo err
ok
// 取反
[root@zmy script]#: [ !-f /etc/passwd ] && echo ok ||echo err
err
|