Shell编程3小时光速入门
1、为什么要学习shell编程?
Linux系统中会大量的使用Shell,工作中我们也需要自动化实现业务,例如:自动备份、监控、自动安装服务
Shell编程是Linux运维人员必须要会编程语言。最简单的编程语言。
编程也是运维人员必须具备的本领:
Shell、python是运维人员必须具备的本领
2、什么是Shell?
shell就是一个解释器(翻译官),命令行的命令以及脚本都会通过shell解释,传给操作系统,处理后在输出给用户。
3、Shell的分类
/bin/sh、/bin/bash、/usr/bin/sh、/usr/bin/bash
4、CentOS7默认Shell
[root@zhang ~]# echo $SHELL
/bin/bash
5、什么是Shell脚本?
程序、命令放入文件里执行,这个文件称之为Shell脚本文件。
工作中最多的编程写脚本,存放在文件里。
6、Shell的变量:
A.全局变量(环境变量)
在整个系统中生效、一般是大写、系统中会默认存在这样的变量,满足系统和程序运行的需求。
系统自带的环境变量;
[root@zhang ~]# echo $PS1
[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\] \[\e[31;1m\]\w\[\e[0m\]]\$
自定义环境变量:
方案一:
方案二:
B.局部变量(普通变量)
是编写Shell脚本最常用的变量
用法:变量名=值(a=1)
要求
变量名:数字、字母、下划线、不能是数字开头。
=等号:赋值符(把XXX给谁)。
值:东西,变量内容
引用内容的符号:单引号、双引号、反引号、不加引号
举例:
[root@zhang ~]# a=1
[root@zhang ~]# echo $a
1
[root@zhang ~]# a=1
[root@zhang ~]# echo ${a}b
1b
7、表达式
[ 表达式 ]中括号表达式,中括号里面两端必须要有空格。
字符串要加双引号
[root@zhang ~]# [ "a" = "b" ] &&echo 1|echo 0 #<==如果表达式成立,打印1,否者打印0.
0
[root@zhang ~]# [ "a" = "b" ] || echo 0 #<==如果表达式成立是假的,打印0
0
取反:
[root@zhang ~]# [ ! "a" = "b" ] &&echo 1
1
整数表达式:
.> -gt
.>= -ge
< -lt
<= -le
= -eq
不等于 -ne
举例:
[root@zhang ~]# a=1
[root@zhang ~]# echo $a
1
[root@zhang ~]# [ $a -gt 2 ] &&echo 1||echo 0
0
[root@zhang ~]# [ $a -ge 2 ] &&echo 1||echo 0
0
[root@zhang ~]# [ $a -lt 2 ] &&echo 1||echo 0
1
[root@zhang ~]# [ $a -le 2 ] &&echo 1||echo 0
1
[root@zhang ~]# [ $a -eq 2 ] &&echo 1||echo 0
0
[root@zhang ~]# [ $a -ne 2 ] &&echo 1||echo 0
1
(1)整数表达式符 两端必须要有空格。
(2)中括号里面两端必须要有空格。
(3)变量和比较的内容,不需要加引号。
字符表达式:
-z 变量内容长度为0,为真。zero
-n 变量内容长度为【不】为0时,为真。not zero
a==a字符串时=是否相同 条件:
①字符串要加双引号
[root@zhang ~]# a="I am munan"
[root@zhang ~]# [ -n "$a" ] &&echo 1||echo 0
1
[root@zhang ~]# [ -z "$a" ] &&echo 1||echo 0
0
Shell判断句:
如果。。。那么
如果[ 我是DJ ] 那么你会爱我吗
if判断句语法:
if [ 表达式 ]
then命令
fi
举例:
[root@zhang ~]# vim munan.sh
#!/bin/bash
a=1
if [ $a -eq 1 ]
then
echo 1
fi
[root@zhang ~]# vim munan.sh
#!/bin/bash
munan="DJ"
if [ "$munan" == "DJ" ]
then
echo "和你谈谈理想"
else
echo "拜拜 "
fi
[root@zhang ~]# sh munan.sh
和你谈谈理想
[root@zhang ~]# vim date.sh
if [ $(date +%w) -eq 6 ]
then
echo "休息"
else
echo "上课"
fi
7、read命令 交互式读取用户输入
-p "提醒:"
-t "多长时间内等待输入"
[root@zhang ~]# read -p "请输入一句话:" boy
请输入一句话:潜力股
[root@oldboyedu ~]# echo $boy
潜力股
相当于boy="潜力股"
[root@oldboyedu ~]# cat test.sh
.#!/bin/bash
read -p "请输入你喜欢的男孩的一句话:" boy
if [ "$boy" == "潜力股" ]
then
echo "先和你谈谈朋友"
else
echo "白白"
fi
[root@zhang ~]# sh test.sh
请输入你喜欢的男孩的一句话:我没钱
白白
[root@zhang ~]# sh test.sh
请输入你喜欢的男孩的一句话:潜力股
先和你谈谈朋友
root@zhang ~]# cat test.sh
.#!/bin/bash
read -p "请输入你喜欢的男孩的一句话:" boy
if [ "$boy" == "潜力股" ]
then
echo "先和你谈谈朋友"
elif [ "$boy" == "老爸是李刚" ]
then
echo "直接嫁给你"
elif [ "$boy" == "二环内有套房" ]
then
echo "立马领证"
else
echo "白白"
fi
练习题:Shell编程实现 两个整数比较大小
特殊位置变量:
1
2
[root@zhang ~]# cat t.sh
echo $1 $2
[root@zhang ~]# sh t.sh ZZZ XXX
ZZZ XXX #<==ZZZ就是$1输出的结果,XXX就是$2输出的结果。
[root@zhang ~]# cat com_num.sh
#!/bin/sh
#read -p "请输入两个整数:" a b
a=$1
b=$2
if [ $a -gt $b ]
then
echo "$a>$b"
elif [ $a -eq $b ]
then
echo "$a=$b"
else
echo "$a<$b"
fi
[root@oldboyedu ~]# sh com_num.sh 2 3
2<3
[root@oldboyedu ~]# sh com_num.sh 2 2
2=2
[root@oldboyedu ~]# sh com_num.sh 3 2
3>2
9、for循环
for n in 取值列表
do
执行命令
done
[root@zhang~]# cat for1.sh
for n in 1 2 3 4 5
do
echo $n
done
[root@zhang~]# sh for1.sh
1
2
3
4
5
[root@zhang~]# sh -x for1.sh
+ for n in 1 2 3 4 5
+ echo 1
1
+ for n in 1 2 3 4 5
+ echo 2
2
+ for n in 1 2 3 4 5
+ echo 3
3
+ for n in 1 2 3 4 5
+ echo 4
4
+ for n in 1 2 3 4 5
+ echo 5
5
[root@zhang~]# cat for1.sh
for n in {1..5}
do
echo $n
done
[root@zhang~]# sh for1.sh
1
2
3
4
5
练习题:打印254个IP
书写脚本习惯:
1)以.sh结尾
2)脚本开头第一行#!/bin/bash 脚本内容由谁解释。
由于Linux下默认时bash,所以也可以忽略这一行