shell 编程基础
为后期的集群架构做准备
1,在linux系统中会大量使用shell,工作中的我们也需要自动化实现业务,
例如:自动备份 ,监控,自动安装服务。
Shell编程是linux运维人员必须要会的编程语言,也是最简单的编程语言
编程也是运维人员必须具备的本领:shell python是运维人员必须具备的本领
2,什么是shell ?
Shell就是一个解释器,命令行的命令以及脚本都会通过shell解释,传给操作系统,处理后在输出给用户
3,shell分类
Bourne shell
C shell
[root@zhangxiangyu-58 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
4,C7:默认的shell
[root@zhangxiangyu-58 ~]# echo $SHELL
/bin/bash
5,什么是shell脚本?
一般我们会把程序,命令放入文件中执行,这个文就称为shell脚本
工作中最多的就是编程写脚本,存放在文件里
6,shell变量:
A,全局变量(环境变量)
在整个系统中生效,一般是大写,系统中默认就存在一些这样的变量,满足系统和程序运行的需求
系统自带的环境变量:
[root@zhangxiangyu-58 ~]# echo $PS1
[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\] \[\e[31;1m\]\w\[\e[0m\]]\$
[root@zhangxiangyu-58 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
自定义环境变量:
export OLDBOY=“I am oldboy”
/etc/profile==> ~/.bash_profile ===> ~.bashrc===>/etc/bashrc
推荐把环境变量放入/etc/bashrc
root@zhangxiangyu-58 ~]# export OLDBOY="I am oldboy"
[root@zhangxiangyu-58 ~]# . /etc/bashrc
[root@zhangxiangyu-58 ~]# echo $OLDBOY
I am oldboy
B,局部变量(自定义变量)
是编写shell脚本最常用的变量
变量名=值
a=1
变量名:数字 , 字母 , 下划线 , 但不能是数字开头
= 等号在这里面叫做赋值符,也就是把什么东西给谁
值:就是东西,变量内容。
引用内容的符号:单引号,双引号,反引号,不加引号
[root@zhangxiangyu-58 ~]# a=1 >>>把1赋值给a,也就是a里面有个1
[root@zhangxiangyu-58 ~]# echo $a
1
[root@zhangxiangyu-58 ~]# a=oldboy >>>默认会覆盖
[root@zhangxiangyu-58 ~]# echo $a
oldboy
[root@zhangxiangyu-58 ~]# y=$x+1
[root@zhangxiangyu-58 ~]# echo $y
1+1
[root@zhangxiangyu-58 ~]# y='$x+1'
[root@zhangxiangyu-58 ~]# echo $y
$x+1
[root@zhangxiangyu-58 ~]# let y="$x+1" >>>让括号里的内容进行计算
[root@zhangxiangyu-58 ~]# echo $y
2
[root@zhangxiangyu-58 ~]# a=1
[root@zhangxiangyu-58 ~]# echo ${a}b
1b
7,表达式
[ ] 中括号表达式,中括号里的两边必须要有空格。
字符串要加双引号
[root@zhangxiangyu-58 ~]# [ a=a ] && echo 1||echo 0
1
[root@zhangxiangyu-58 ~]# [ "a" = "b" ] && echo 1||echo 0
0
如果表达式成立,打印1 ,否则打印0
[root@zhangxiangyu-58 ~]# [ "a" = "b" ] && echo 1 >>>&&前面的去后面的就跟着去
[root@zhangxiangyu-58 ~]# [ "a" = "b" ] ||echo 0 >>>||前面的去后面的就不去,前面的不去,后面的就去
0
取反
[ ! “a” = “b” ] && echo 1
整数表达式:
> —gt
>= —ge
< —lt
<= —le
= —eq
不等于 —ne
[root@zhangxiangyu-58 ~]# a=1
[root@zhangxiangyu-58 ~]# [ $a -eq 2 ] && echo 1||echo 0
0
[root@zhangxiangyu-58 ~]# [ $a -eq 1 ] && echo 1||echo 0
1
[root@zhangxiangyu-58 ~]# [ $a -gt 1 ] && echo 1||echo 0
0
[root@zhangxiangyu-58 ~]# [ $a -ge 1 ] && echo 1||echo 0
1
[root@zhangxiangyu-58 ~]# [ $a -lt 2 ] && echo 1||echo 0
1
[root@zhangxiangyu-58 ~]# [ $a -ne 2 ] && echo 1||echo 0
1
[root@zhangxiangyu-58 ~]# [ $a -ne 1 ] && echo 1||echo 0
0
整数表达式符 两端必须要有空格
中括号里面的两端必须要有空格
变量和比较的内容可以不需要加引号
字符表达式:
—z 变量内长度为0时,为真(正确)。 Zero
—n 变量内容长度【不】为0时,为真(正确) not zero
[root@zhangxiangyu-58 ~]# oldboy="I am oldboy"
[root@zhangxiangyu-58 ~]# [ -z "$oldboy" ]&& echo 1||echo 0
0
[root@zhangxiangyu-58 ~]# [ -n "$oldboy" ]&& echo 1||echo 0
1
[root@zhangxiangyu-58 ~]# oldboy=""
[root@zhangxiangyu-58 ~]# [ -z "$oldboy" ]&& echo 1||echo 0
1
[root@zhangxiangyu-58 ~]# [ -n "$oldboy" ]&& echo 1||echo 0
0
a == a 字符串是否相同
说明:
字符串要加双引号
[root@zhangxiangyu-58 ~]# [ "test" == "host" ]&& echo 1||echo 0
0
[root@zhangxiangyu-58 ~]# [ "test" == "test" ]&& echo 1||echo 0
1
8,shell判断句
如果什么什么那么就什么什么
if 判断句语法
if 【表达式】
then
命令
fi
[root@zhangxiangyu-58 ~]# cat test.sh
#!/bin/bash
a=10
if [ $a -gt 1 ]
then
echo 1
fi
[root@zhangxiangyu-58 ~]# cat test.sh
#!/bin/bash
boy="潜力股"
if [ "$boy" == "潜力股" ]
then
echo "先和你谈谈朋友"
else
echo "拜拜"
fi
[root@zhangxiangyu-58 ~]# bash test.sh
先和你谈谈朋友
书写脚本习惯:
1,以 .sh 结尾。
2,脚本开头第一行 #!/bin/bash 脚本内容交给谁解释
read 交互式读取用户输入
read 命令 读取用户输入
-p “提醒”
-t “多长时间内等待输入”
[root@zhangxiangyu-58 ~]# read -t 3 -p "你想干啥"
你想干啥[root@zhangxiangyu-58 ~]#
特殊位置变量:
$1 脚本文件的第一个参数
$2 脚本文件的第二个参数
9,for循环
for n in 取值列表
do
执行命令
done