shell基本知识1
一、shell介绍
通常所说的shell就是shell脚本,它是一门脚本语言,弱类型,在定义时不需要指定变量类型
二、shell规范
1)第一行内容为#!/bin/bash,表示使用shell进行编程
2)#:shell中的注释
3)shell脚本是以.sh结尾的文件
三、语法
1、变量
1)定义变量格式
变量名=变量值 #==两边没有空格
2)变量命名规范
由字母、数字、下划线组成,不能已数字开头
3)输出和释放变量
输出变量:echo $变量名
释放变量:unset 变量名
4)特殊变量,带有空格的
双引号:如果变量值中存在$变量名(即变量)的话,那么输出结果将会是变量名对应的变量值,如果想原样输出,则可以在$变量名前加转义字符\
单引号:不管内容如何都原样输出
反单引号:专门用于存放命令
2、read的用法
1)方法1:read 变量名1 变量名2 。。。。
说明:变量名可以1个或多个,多个时变量名之间用空格隔开,如果给出变量值多于变量名,则把多余出的变量值都赋给最后一个变量
2)方法2:read -p '提示内容' 变量名1 变量名2 。。。。。
说明:添加提示信息,便于方便知道需要输入什么参数
3、参数传递
1)向.sh文件中传入数据
格式:sh xw.sh /etc /root ... 命令 文件名 参数1 参数2 。。。
2)文件内接收参数
$1:第一个参数
$2:第二个参数
。
。
。
$n:第n个参数
$0:为文件名
$@:所有参数
$#:参数个数
4、重定向
说明:把命令的内容输出到文件中
正确命令:由1表示
覆盖:命令 1>文件名 例:ls 1>1.txt
追加:命令 1>>文件名 例:ls 1>>1.txt
错误命令:由2表示
覆盖:命令 2>文件名 例:ls 2>1.txt
追加:命令 2>>文件名 例:ls 2>>2.txt
5、分支结构(if...else...)
1)格式:
if [ 条件 ];then
语句
else
语句
fi
2)注意事项
条件两边有空格隔开
多个条件之间要有空格
if后面要有空格
条件中如果存在变量,则变量两边需要添加双引号
3)案例 判断目录是否为空
6、逻辑运算符
1)说明:
且:-a
或:-o
非:!
2)案例:判断用户输入的用户名和密码是否为admin 123456,是则提示登录成功,否则提示登录失败
7、比较运算
1)说明:
-eq:判断是否相等
-gt:判断是否大于
-ge:判断是否大于等于
-lt:判断是否小于
-le:判断是否小于等于
-ne:判断是否不等于
2)数字变量操作
加1
((i++)) ((i+=1)) i=$[$i+1] i=$(($i+1)) let i=i+1
减1
((i--)) ((i-=1)) i=$[$i-1] i=$(($i-1)) let i=i-1
注:加减n,则把1变为n即可
3)案例:输入数字,判断数字是否大于0,大于0则将该数字减1并输出,否则加1并输出
8、判断目录、文件是否存在
1)test:
test -e 文件名:表示文件是否存在
test -f 文件名:表示文件是否存在且为文件
test -d 文件名:表示文件是否存在且为目录
test -r 文件名:可读
test -x 文件名:可操作
test -w 文件名:可写
2)案例1:利用test判断文件
3)if+参数
说明:去掉test,但沿用参数
格式:if [ -参数 ] 文件名
4)案例2:直接利用if+参数判断文件
注:也可以判断字符是否相等
案例1:判断数字是否等于3
案例2:判断字符是否相等
案例3:循环ping网络ip+并发控制:循环ping192.168.10.6--192.168.10.10之间的ip通讯
注:{程序}& 表示将程序放置在后台并行执行,如果需要等待执行完在进行下面动作,需要添加wait
9、if...elif...else分支
1)格式:
if [ 条件1 ];then
语句1
elif [ 条件2 ];then
语句2
elif [ 条件3 ];then
语句3
。。。。。
elif [ 条件n ];then
语句n
else
语句
fi
2)案例:判断学生成绩,[90-100]提示优秀,[80-90)提示良好,[70-80)提示一般,[60-70)提示及格,其他不及格
10、case分支
1)格式:
case $变量名 in
"值1")
语句1;;
"值2")
语句2;;
........
*)
语句n
esac
2)注意:
① case这一行最后必须是in
② ;;为结束语句
③ *默认
④ ‘值’可以是字符串也可以是数字
⑤ ‘值’也可以是范围
3)案例1:循环输入一个字母,判断该用户选择的是哪款产品,A:电饭锅;B:洗衣机;C:捡肥皂,D的提示输入错误,结束循环,退出
4)案例2:请输入对客服的满意度,【0-3】为不满意,【4-6】为满意,【7-9】为非常满意
5)案例3:模拟一个多任务维护界面,当执行时先显示总菜单,然后选择后进行相应的操作
#!/bin/bash
cat <<-EOF //cat << -EOF 这里代表先输入,最后输入EOF为结束,最后一起把前面输入的数据一起显示出来
*************请选择*************** h 显示命令帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序 EOF while true do read -p "请输入你要的选择:" choice case $choice in h) cat<<-EOF h 显示命令帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序 EOF;; f) lsblk;; d) mount;; m) free -m;; u) uptime;; q) exit;; esac done
11、循环结构:for循环
1)格式
for 变量名 in 列表
do
语句
done
2)列表
格式1:seq start size max
格式2:{start..max..size}
说明:
start:开始点
size:间隔,若为1则可省略不写
max:结束点
3)案例:输入1-10之间的奇数 (下图2和10之间的下划线是鼠标悬浮,此处是没有下划线的)
4)案例:求1-100之间的和
方法1:步进风格
方法2:列表风格
方法3:C类风格
12、循环结构:while循环
1)格式
while [ 条件 ]
do
命令
done
2)案例:求1到100之间的和
13、练习
##每隔30s同步一次时间,同步失败则发送邮件,同步成功100次也发送一次邮件
思路:(1)30s同步一次时间,while死循环,while true 或者while [ 1 -eq 1]类似
(2)同步失败发送一次邮件,同步时间:ntpdate 服务器ip 或者rdate -s 服务器ip
(3)同步成功100次发送一次邮件,此处需要保存成功的次数,每隔成功100次都需要发送一次邮件,所以需要$[$count%100] -eq 0,若次数是100的倍数就发一次
实现:
14、until循环
特点:条件为假就进入循环,为真就退出循环
格式:until [条件]
do
命令
done
案例:用until循环打印1-5
15、RANDOM 随机数
(1)获取随机数:echo $RANDOM
(2)获取0到n之间的随机数:echo $[$RANDOM%(n+1)] //echo $[$RANDOM%5]:获取0-4之间的随机数
(3)获取上一次获取的随机数:set | grep RANDOM
案例1:一个脚本,产生一个文件phone.txt,随机产生以139开头的手机号10个,一个一行
案例2:在案例1中的phone.txt中抽取5个幸运观众,显示出这5个幸运观众,但只显示号码的前三位和后四位,中间四位用*代替
思路:(1)确定幸运观众行号:0-100,随机数字,$[$RANDOM%100+1]
(2)提取电话号码:head -(1)中的随机数字 phone.txt | tail -1 即前几行中的最后一行内容
(3)显示前三位和后四位电话号码:phone_num=13912345678 echo "139****${phone:7:4}", ${phone:7:4}代表phone中从第7位开始后面4位
16、shift 位移
说明:使位置参数向左移动,默认移动一位,可以使用shift n 来移动n位
案例1:for循环方法打印1-10之间的奇数和
案例2:shift方法打印1-10之间奇数和
17、expect
案例:从普通用户自动切换到root用户
#执行shell脚本时不能直接用sh *.sh或者./*.sh,即使您在顶部指定了带有bang的环境,您仍然必须使用expect -f运行它。所以需要用expect -f ./*.sh
18、函数
1)两种定义:
函数名()
{
函数体(一堆命令的集合,实现一些功能)
}
function 函数名()
{
函数体(一堆命令的集合,实现一些功能)
}
2)函数中return的运用说明
#return可以结束一个函数,类似循环控制语句break(结束当前循环,执行循环体后面的代码)
#return默认返回函数中最后一个命令状态值,也可以给定参数值,范围在0-256之间
#如果没有return命令,函数将返回最后一个指令的退出状态值
3)调用
#必须先定义函数
#两种调用方法:
在当前命令行调用
脚本中调用
4)函数中的参数
①:使用$n来接收数据
5)返回值
①:正确时返回0
②:错误时返回1
③:查看返回值内容:$?
6)案例1:只打印hello,修改返回值为66
7)案例2:输入一个目录,判断目录是否存在,如果不存在则给出提示,如果存在则提示输入要创建的文件名,并判断创建的文件是否存在,如果不存在,则继续创建,否则提示该文件存在,删了跑路
8)案例3:写一个脚本收集用户输入的基本信息(姓名、性别、年龄),如不输入则一直提示输入,最后根据用户的信息输出相对应的内容
第一种写法:
第二种写法:
输出结果: