目录
日常运维工作大部分是一些繁琐的重复的工作,每天80%的工作就是重复干昨天的事情,而且工作量还比较大,那么摆在运维面前的选择就是:
A:自己搞定一切
B:让机器搞定一切
当然,谁不愿意喝着茶水,逗着前台妹子过完愉快的一天呢!如何让机器搞定一切,得以解放自己
shell课程大纲
Shell的作用------命令解释器,“翻译器”
介于系统内核与用户之间,负责解释命令行
shell 功能
命令行解释功能
启动程序
输入输出重定向
管道连接
文件名置换 (echo /*)
变量维护
环境控制
shell编程
shell脚本就是将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。
一、如何写一个shell脚本
shell脚本的命名:
名字要有意义,最好不要用a、b、c、d、1、2、3、4这种方式命名;
虽然linux系统中,文件没有扩展名的概念,依然建议你用.sh结尾;
名字不要太长,最好能在30个字节以内解决。
例如:check_memory.sh
shell脚本格式:
shell脚本开头必须指定脚本运行环境 以 #!这个特殊符号组合来组成。
如: #!/bin/bash 指定该脚本是运行解析由/bin/bash来完成的;
shell中的注释使用 # 号
二、如何运行一个shell脚本
脚本运行需要执行权限,当我们给一个文件赋予执行权限后,该脚本就可以运行。
#chmod +x filename
如果不希望赋予脚本执行权限,那么可以使用bash命令来运行未给予执行权限的脚本bash fiename
#bash filename
三、shell中的特殊符号
~: 家目录 # cd ~ 代表进入用户家目录
!: 执行历史命令 !! 执行上一条命令
$: 变量中取内容符
+ - * \ %: 对应数学运算 加 减 乘 除 取余数
&: 后台执行
*: 星号是shell中的通配符 匹配所有
?: 问号是shell中的通配符 匹配除回车以外的一个字符
;: 分号可以在shell中一行执行多个命令,命令之间用分号分割
|: 管道符 上一个命令的输出作为下一个命令的输入 cat filename | grep "abc"
\: 转义字符
``: 反引号 命令中执行命令 echo "today is `date +%F`"
' ': 单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不解释变量
" ": 双引号,脚本中出现的字符串可以用双引号引起来
四、shell中的管道运用
| 管道符在shell中使用是最多的,很多组合命令都需要通过组合命令来完成输出。
管道符其实就是下一个命令对上一个命令的输出做处理。
[root@localhost opt]# ls /opt |wc
2 2 12
修改密码
[root@localhost opt]# echo "123123" |passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新
[root@test1 ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
[root@test1 ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
zhangsan /bin/bash
lisi /bin/bash
五、shell重定向
[root@localhost ~]#ls >/dev/pts/1
#打开两个终端,ls命令显示到终端1上 标准重定向省略了1>
[root@localhost ~]#xxx >/dev/pts/1
##错误重定向
bash: xxx: 未找到命令...
[root@localhost ~]#xxx 2>/dev/pts/1
##会在另一边显示
[root@localhost ~]#rm xxx.txt >/dev/pts/1
#提示信息也是错误
rm: 无法删除"xxx.txt": 没有那个文件或目录
[root@localhost ~]#rm xxx.txt 2>/dev/pts/1
[root@localhost ~]#ls /data /error >all.log 2>&1
#既有错误也有正确 &符号表示分隔符
[root@localhost ~]#cat all.log
ls: 无法访问/error: 没有那个文件或目录
/data:
apr-1.6.2.tar.gz
apr-util-1.6.0.tar.gz
httpd-2.4.29.tar.bz2
[root@localhost ~]#ls /data /error >all.log 2>1
#如果没有&会生成一个 1文件 将错误导入
[root@localhost ~]#cat bc.log
2*6
[root@localhost ~]#bc <bc.log
[root@test1 ~]# vim passwd.txt\\重定向输入
123321
[root@test1 ~]# setenforce 0 \\关闭selinux否则会有问题
[root@test1 ~]# passwd --stdin lisi <passwd.txt
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@test1 ~]# cat passwd.txt
123321
[root@test1 ~]# echo "123123" > passwd.txt //单个覆盖,多个不覆盖追加
[root@test1 ~]# cat passwd.txt
123123
[root@test1 ~]# ls > passwd.txt //将命令结果放进文本中
[root@test1 ~]# cat passwd.txt
bin
cpu
disk.sh
first.sh
f.sh
gs.sh
g.txt
passwd.txt
sdb.sh
source
test.sh
[root@test1 ~]# cat passwd.txt
123123
[root@test1 ~]# echo "123123" >> passwd.txt
[root@test1 ~]# cat passwd.txt
123123
123123
[root@test1 ~]# id wa 2>error.log //将错误信息写入error.log
[root@test1 ~]# cat error.log
id: wa: no such user
[root@test1 ~]# id wa >error.log //不加2 无法写入
id: wa: no such user
[root@test1 ~]# cat passwd.txt error.log &>new //混合输入无论对错
[root@test1 ~]# cat new
bin
cpu
disk.sh
first.sh
f.sh
gs.sh
g.txt
passwd.txt
sdb.sh
source
test.sh
cat: error.log: 没有那个文件或目录
#不能将正确和错误一起显示出来
[root@centos7 ~]#ls /data /xxx > /data/all.log 2>&1
[root@centos7 ~]#ls /data /xxx 2> /data/all.log 1>&2
[root@centos7 ~]#ls /data /xxx &> /data/all.log
[root@centos7 ~]#ls /data /xxx >& /data/all.log
#[root@centos7 ~]#ls /data /xxx 2>&1 > /data/all.log
六、shell数学运算
expr 命令:只能做整数运算,格式比较古板,注意空格
[root@baism ~]# expr 1 + 1
2
[root@baism ~]# expr 5 - 2
3
[root@baism ~]# expr 5 \* 2 #注意*出现应该转义,否则认为是通配符
10
[root@baism ~]# expr 5 / 2
2
[root@baism ~]# expr 5 % 2
1
使用bc计算器处理浮点运算,scale=2代表小数点保留两位
[root@baism ~]# echo "scale=2;3+100"|bc
103
[root@baism ~]# echo "scale=2;100-3"|bc
97
[root@baism ~]# echo "scale=2;100/3"|bc
33.33
[root@baism ~]# echo "scale=2;100*3"|bc
300
双小圆括号运算,在shell中(( ))也可以用来做数学运算
[root@baism ~]# echo $(( 100+3))
103
[root@baism ~]# echo $(( 100-3))
97
[root@baism ~]# echo $(( 100%3))
1
[root@baism ~]# echo $(( 100*3))
300
[root@baism ~]# echo $(( 100/3))
33
[root@baism ~]# echo $(( 100**3)) #开方运算
1000000
总结
主要学习shell脚本的基础,掌握shell脚本对以后的工作会很方便