Shell脚本
1)默认shell类型
[root@shell ~]#
[root@shell ~]# echo $SHELL #查看默认的shell类型
/bin/bash
[root@shell ~]#
2)[endif]shell脚本格式
#!/bin/bash #此部分为固定的脚本声明格式
# abcdef12345…… #这部分内容可以自己定义,为注释内容
ls -l #这部分内容为脚本内容
df -h
Pwd
案例1:构建一个非常简单的shell脚本
[root@shell ~]#
[root@shell ~]# vi script1 #建立第一个测试脚本
[root@shell ~]#
[root@shell ~]# cat script1 #查看测试脚本1中的内容
#!/bin/bash
#this is test script-1
pwd
ls -l
[root@shell ~]#
[root@shell ~]# bash script1 #执行脚本
/root
total 9564
-rw-r--r-- 1 root root 0 Jul 4 23:13 001.txt
-rw-r--r-- 1 root root 8 Jul 5 08:05 0705
-rw-r--r-- 1 root root 52 Jul 5 08:10 0706
-rw-r--r-- 1 root root 2 Jul 4 07:27 1.txt
-rw-r--r-- 1 root root 2 Jul 4 07:27 2.txt
-rw-------. 1 root root 1529 Jun 26 17:28 anaconda-ks.cfg
-rw-r--r-- 1 root root 9758445 Jul 4 09:03 etc.tar.gz
-rw-r--r-- 1 root root 46 Jul 8 10:33 script1
-rw-r--r--. 1 root root 78 Jun 29 11:42 sed.txt
-rw-r--r--. 1 root root 618 Jun 28 09:37 test.txt
[root@shell ~]#
[if !supportLists]3)[endif]shell脚本说明
脚本可以接受用户输入的参数;
脚本可以根据用户输入的参数,进行判断
$0 :脚本的名称
$# :总共接收到的参数个数
$* :分别接收到的参数内容是什么
$1,$2,$3 :表示第1,2,3个接收到的参数是什么
[root@shell ~]#
[root@shell ~]# vi script2 #新建脚本文件
[root@shell ~]#
[root@shell ~]# cat script2
!#/bin/bash
# this is test-2 script
echo "$0"
echo "$#,$*"
echo "$1,$3,$5"
[root@shell ~]#
[root@shell ~]# bash script2 a b c d e f g #执行脚本
script2: line 1: !#/bin/bash: No such file or directory
script2
7,a b c d e f g
a,c,e
[root@shell ~]#
测试语句
[root@shell ~]#
[root@shell ~]# [ -d /etc ] #判断 /etc是否为目录
[root@shell ~]#
[root@shell ~]# echo $? #判断上一条测试命令是否执行成功,0代表成功
0
[root@shell ~]#
[root@shell ~]# [ -f /etc ] #判断/etc是否为普通文件
[root@shell ~]# echo $? # /etc为目录,不是普通文件
1
[root@shell ~]#
&&(逻辑与) :当上一条语句执行成功,则会执行后面的语句
||(逻辑或) :当上一条语句执行失败,则会执行后面的语句
!(逻辑非):对判断值取反,若判断成功则结果变成失败,反之亦然
[root@shell ~]#
[root@shell ~]# [ 5 > 3 ] #判断5是否大于3
[root@shell ~]# echo $?
0
[root@shell ~]#
[root@shell ~]# [ -f /etc/fstab ] #判断fstab是否为普通文件
[root@shell ~]# echo $?
0
[root@shell ~]#
[root@shell ~]#
[root@shell ~]# [ -r /etc/fstab ] #判断用户对fstab是否有可读权限
[root@shell ~]# echo $? #为0证明有可读权限
0
[root@shell ~]#
[root@shell ~]#
[root@shell ~]# [ -e /etc/my.cnf ] #判断my.cnf该文件是否存在
[root@shell ~]# echo $? #为0证明存在
0
[root@shell ~]#
[root@shell ~]# [ -e /etc/test ] #判断test该文件是否存在
[root@shell ~]# echo $? #为1证明不存在
1
[root@shell ~]#
[root@shell ~]#
[root@shell ~]# [ -f /etc/my.cnf ] && echo "存在" #若my.cnf存在的话,则将结果“存在”打印出来
存在
[root@shell ~]#
[root@shell ~]#
[root@shell ~]# [ -f /etc/test ] || echo "不存在" #若my.cnf不存在的话,则将结果“不存在”打印出来
不存在
[root@shell ~]#
[root@shell ~]#
[root@shell ~]# [ ! -e /etc/my.cnf ] #判断my.cnf该文件是否不存在
[root@shell ~]# echo $?
1
[root@shell ~]#
[root@shell ~]#
[root@shell ~]# echo $USER #查看当前登录用户是谁
root
[root@shell ~]#
[root@shell ~]# [ $USER=root ] #判断当前登录用户是root
[root@shell ~]# echo $? #0代表当前用户是root
0
[root@shell ~]#
[root@shell ~]# [ ! $USER=root ] #判断当前登录用户不是root
[root@shell ~]# echo $? #1代表判断错误
1
[root@shell ~]#
-ge :是否大于等于
[root@shell ~]#
[root@shell ~]# [ 5 -ge 3 ] #判断5是否大于等于3
[root@shell ~]# echo $?
0
[root@shell ~]#
-eq :是否等于
[root@shell ~]#
[root@shell ~]# [ 1 -eq 1 ] #判断1是否等于1
[root@shell ~]# echo $?
0
[root@shell ~]#
lt :是否小于
[root@shell ~]#
[root@shell ~]# [ `free -m | grep Mem: | awk '{print $4}'` -lt 1024 ] && echo "memery not enough" || echo "memery is enough" #判断系统当前内存是否小于1G,如果小于1G的话则输出“内存不足”如果大于1G的话则输出“内存充足”
memery not enough
[root@shell ~]#
if 条件测试语句
[root@shell ~]#
[root@shell ~]# vim script1 #创建脚本1
[root@shell ~]# cat script1 #查看脚本内容
#!/bin/bash
if [ ! -e /root/test ]
then
mkdir /root/test
fi
[root@shell ~]#
[root@shell ~]# ls /root/test #查看test文件是否存在
ls: cannot access /root/test: No such file or directory
[root@shell ~]#
[root@shell ~]# bash script1 #执行脚本
[root@shell ~]# ls /root/test/
[root@shell ~]#
[root@shell ~]# ls /root/test #再次查看test文件是否存在
[root@shell ~]#
/dev/null :系统中的黑洞文件,所以放入该目录内的文件都将被系统删除,相当于Linux的垃圾箱或者回收站一样
[root@shell ~]#
[root@shell ~]# vim script2 #创建脚本2
[root@shell ~]#
[root@shell ~]# cat script2 #查看脚本内容
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "host $1 is on-line"
else
echo "host $1 is off-line"
fi
[root@shell ~]#
[root@shell ~]# ip a | grep 192.168. #查看当前主机的IP
inet 192.168.11.128/24 brd 192.168.11.255 scope global dynamic ens33
[root@shell ~]#
[root@shell ~]# bash script2 192.168.11.128 #执行脚本2
host 192.168.11.128 is on-line #为在线状态
[root@shell ~]#
[root@shell ~]# bash script2 10.0.3.2 #随便输入一个地址显示不在线
host 10.0.3.2 is off-line
[root@shell ~]#
注释:$1为第一个变量的值,bash script2后面的IP地址
[root@shell ~]#
[root@shell ~]# vim script3 #创建脚本3
[root@shell ~]# cat script3 #查看脚本3内容
#!/bin/bash
read -p "Enter:" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
echo "$GRADE is good"
elif [ $GRADE -ge 60 ] && [ $GRADE -le 84 ]
then
echo "$GRADE is pass"
else
echo "$GRADE is fail"
fi
[root@shell ~]#
root@shell ~]#
[root@shell ~]# bash script3 #执行脚本3
Enter:99
99 is good
[root@shell ~]#
[root@shell ~]# bash script3 #执行脚本3
Enter:65
65 is pass
[root@shell ~]#
[root@shell ~]# bash script3 #执行脚本3
Enter:49
49 is fail
[root@shell ~]#
for循环语句
[root@shell ~]#
[root@shell ~]# vi /users.txt #创建文本文件
[root@shell ~]# cat users.txt
zhangsan
wangwu
zhaoliu
[root@shell ~]#
[root@shell ~]# vim script4 #创建脚本4
[root@shell ~]#
[root@shell ~]# cat script4 #查看脚本4的内容
#!/bin/bash
read -p "Enter:" PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "already exists"
else
useradd $UNAME &> /dev/null
echo "PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME,create success"
else
echo "$UNAME,create failure"
fi
fi
done
[root@shell ~]#
[root@shell ~]# bash script4 #执行脚本
Enter:redhat
zhangsan,create success
wangwu,create success
zhaoliu,create success
[root@shell ~]#
检测主机存活率
[root@shell ~]#
[root@shell ~]# vi host.txt #先创建一个主机文件
[root@shell ~]# cat host.txt #查看文件信息
192.168.11.128
123.456.20.5
92.8.60.32
10.5.23.8
127.0.0.1
[root@shell ~]#
[root@shell ~]#
[root@shell ~]# vim script5 #创建脚本5
[root@shell ~]# cat script5 #查看脚本内容
#!/bin/bash
for IP in `cat host.txt`
do
ping -c 3 -i 0.2 -W 3 $IP >& /dev/null
if [ $? -eq 0 ]
then
echo "$IP is on-line"
else
echo "$IP is off-line"
fi
done
[root@shell ~]#
[root@shell ~]# bash script5 #执行脚本5
192.168.11.128 is on-line
123.456.20.5 is off-line
92.8.60.32 is off-line
10.5.23.8 is off-line
127.0.0.1 is on-line
[root@shell ~]#
for循环语句按照某个范围来循环;
where循环语句按照某个条件来循环
case语句
匹配数字或者字母
[root@shell ~]#
[root@shell ~]# vim script6 #创建脚本6
[root@shell ~]#
[root@shell ~]# cat script6 #查看脚本内容
#!/bin/bash
read -p "Enter:" CTSI
case "$CTSI" in
[a-z]|[A-Z])
echo "字母"
;;
[0-9])
echo "数字"
;;
*)
echo "乱码"
;;
esac
[root@shell ~]#
[root@shell ~]# bash script6 #执行脚本6
Enter:6
数字
[root@shell ~]#
[root@shell ~]# bash script6
Enter:s
字母
[root@shell ~]#
[root@shell ~]# bash script6
Enter:&
乱码
[root@shell ~]#