13-shell编程
一.shell脚本介绍
shell是什么?
一门编程语言,用来解释执行这门编程语言语法的解释器
计算机体系结构:命令—>shell解释器—>系统调用的接口—>内核—>计算机硬件
什么是编程语言:人——————>编程语言——————>计算机
什么是编程:人——————>编程语言——————>计算机(先干什么—>再干什么—>然后干什么)
什么是程序:我们把计算机做事的步骤用编程语言翻译下来,然后存放到文件中,该文件就是程序
运行shell脚本
权限:当前用户需要对脚本文件有r和x权限
一个shell脚本运行的三个步骤:bash a.sh
1.先启动bash解释器
2.bash解释器会把a.sh的内容从硬盘读入内存
3.bash解释器会识别刚刚读入内存内容,解释执行shell代码
运行shell脚本的两种方式
方式1:
bash 脚本的文件路径
方式2:
脚本的文件绝对路径
./脚本的文件相对路径
二.shell语法
1.变量
什么是变量?
变:事物的状态是可以变化的
量:记录下事物的状态
为何要有变量?
如何用变量?
使用原则:先定义后使用
定义变量:
height=190
age=18
name=egon
访问变量:
echo $height
echo ${height}
修改:
height=200
变量的三大组成部分:
变量名:相当于门牌号,是用来访问到变量值的
赋值符号:把变量值的地址绑定给变量名
变量值:记录的事物状态,即存放到内存中的数据
变量名的命名:
前提:在见名知意的前提下,尽可能地精简
规则:
1.由字母数字下划线组成:height_of_egon=190
2.不能以数字开头
3.不能使用关键字
4.不要使用中文
变量值:
整型:年龄,等级,号码
age=19
浮点型:薪资,身高,体重
salary=3.3
字符串:描述性质的状态,名字,性别,爱好,国籍
msg="hello world"
msg='hello world' # 硬引用
··反引号 # 取结果集,touch ·date +%F·.txt 或者 touch $(date +%F).txt
2.变量的作用域
变量的作用域就是变量的生效范围
全局作用域:在当前shell进程里有效(首先vim b.sh;source b.sh表示b.sh在当前进程运行;bash b.sh表示开启一个新的子进程运行)
环境变量:PATH 在所有的进程有效
1).echo "export PATH=$PATH:/root" >> /etc/profile ——>创建新的命令,将命令的绝对路径追加加到PATH变量后
2).PATH=$PATH:/root——>登录用户首先运行bash程序,生效
export PATH——>遗传给其它任何子shell
source /etc/profile——>手动生效
3.流程控制
1)if判断
if 条件1;then
代码1
代码2
代码3
elif 条件2;then
代码1
代码2
代码3
......
else 条件1;then
代码1
代码2
代码3
fi
单分支:
if 条件1;then
代码1
代码2
代码3
fi
双分支:
if 条件1;then
代码1
代码2
代码3
else
代码1
代码2
代码3
fi
#!bin/bash
echo "111"
echo "222"
if [ 10 -gt 30 ];then
echo "ok"
else
echo "no"
fi
echo "333"
多分支:
#!/bin/bash
read -p "请输入你的成绩:" score
if [ $score -ge 90 ];then
echo "优秀"
elif [ $score -ge 80 ] && [ $score -lt 90 ];then
echo "良好"
elif [ $sore -ge 70 ] && [ $score -lt 60 ];then
echo "一般"
else
echo "很差"
fi
2)循环
1.
#!/bin/bash
ping -c www.baidu.com &>/dev/null
if [ $? -eq 0 ];then
echo "network ok"
else
echo "network error"
fi
2.
#!/bin/bash
for i in 0 1 2 3 4
do
echo $i
done
3.
#!/bin/bash
for x in {0..8}
do
if [ $x -eq 6 ];then
break
fi
echo $x
done
4.
#!/bin/bash
for i in {2..254}
do
(ping -c 1 192.168.182.$i &>/dev/null
if [ $? -eq 0 ];then
echo "192.168.182.$i is up"
else
echo "192.168.182.$i is down"
fi) & # ()括号括起来,&表示并发执行,速度快
done
5.
#!/bin/bash
for i in {2..254}
do
ping -c 1 192.168.182.$i &>/dev/null && echo "192.168.182.$i up" >>/tmp/ip1.log || echo "192.168.182.$i down" >>/tmp/ip1.log &
done