大前端

前端学习之家-大前端

shell脚本的应用 正则表达式

自动化运维工具
puppet和脚本结合的好
ansible和python结合的好
salstack自动化运维工具

正则表达式    三剑客:grep、awk、sed
判断/循环语句
函数

脚本:命令的集合,按照一定的格式排序,按一定条件执行

shell脚本的执行方式
1、路径执行:脚本必须具有执行权限
2、   .或source :脚本可以不具备执行权限
3、shell程序执行:系统所安装的shell程序,脚本可以不具备执行权限

shell脚本格式(三部分)
#!/bin/bash        //(名字:shebang)必须放在第一行,指定脚本的执行程序
#注释信息
>>>command      EOF:end of file/END
注释1
注释2
command                 EOF/END
命令的集合

管道符:连接多条命令,前一条命令正确执行结果,作为后一条命令的输入条件
重定向:将输出到屏幕的内容保存到文本文件中
输入0,输出1,错误2
1)标准输入设备:键盘(STDIN),设备描述符为0
2)标准输出设备:显示器(STDOUT),设备描述符为1
3)错误输出设备:显示器(STDERR),设备描述符为2

覆盖输出重定向>:后面的数据会覆盖以前的数据
例:
[root@lala dev]# cat > /a.txt
hahaha(回车)
^C(Ctrl+c)
[root@lala dev]# cat /a.txt 
hahaha
[root@lala dev]# cat > /a.txt
hehehe
^C
[root@lala dev]# cat /a.txt 
hehehe

追加输出重定向>:后面的数据会追加到以前数据的末尾
例:
[root@lala dev]# cat /a.txt 
hehehe
[root@lala dev]# cat >> /a.txt
liuguoxunshigehaohaizi!!!
^C
[root@lala dev]# cat /a.txt 
hehehe
liuguoxunshigehaohaizi!!!

覆盖错误输出重定向2>:后面的数据会覆盖以前的数据
[root@lala dev]# ls /boot/
config-3.10.0-514.el7.x86_64
grub
grub2
initramfs-0-rescue-43412b1f0a0f466380aef8d0611ec1b1.img
initramfs-3.10.0-514.el7.x86_64.img
initramfs-3.10.0-514.el7.x86_64kdump.img
initrd-plymouth.img
symvers-3.10.0-514.el7.x86_64.gz
System.map-3.10.0-514.el7.x86_64
vmlinuz-0-rescue-43412b1f0a0f466380aef8d0611ec1b1
vmlinuz-3.10.0-514.el7.x86_64
[root@lala dev]# ls /booooooooooot 2> /a.txt 
[root@lala dev]# cat /a.txt 
ls: 无法访问/booooooooooot: 没有那个文件或目录

追加错误输出重定向2>>:后面的数据会追加到以前数据的末尾
[root@lala dev]# cat /a.txt 
ls: 无法访问/booooooooooot: 没有那个文件或目录
[root@lala dev]# jwkhdafkjasdh 2>> /a.txt 
[root@lala dev]# cat /a.txt 
ls: 无法访问/booooooooooot: 没有那个文件或目录
bash: jwkhdafkjasdh: 未找到命令...

覆盖混合输出重定向&>:混合重定向(标准和错误重定向)
将标准输出,错误输出到同一个文件
[root@lala dev]# ls /root/ /error >/a.txt 2>/dev/null
[root@lala dev]# ls /root/ /error >/a.txt &>/dev/null
[root@lala dev]# cat /a.txt 

追加混合输出重定向&>>混合重定向(标准和错误重定向)
将标准输出,错误输出到同一个文件
[root@lala dev]# ls /root/ /error >/a.txt &>>/a.txt
[root@lala dev]# cat /a.txt 

标准输入重定向<:把输入设备重定向到文件中

变量:类型
局部变量:只对当前的shell生效
[root@lala ~]# a=5
[root@lala ~]# echo $a
5
[root@lala ~]# bash
[root@haha ~]# echo $a

[root@haha ~]# exit
exit
[root@lala ~]# echo $a
5

全局变量:对所有shell都生效
方法1:
[root@lala ~]# export a=4
[root@lala ~]# bash
[root@haha ~]# echo $a
4

方法2:
[root@lala ~]# a=1.6
[root@lala ~]# export
[root@lala ~]# bash
[root@haha ~]# echo $a
1.6

[root@lala ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
[root@lala ~]# export PATH=$PATH:/usr/local/httpd/bin
[root@lala ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:/usr/local/httpd/bin

用户变量:只对某个用户生效,配置文件宿主目录下.bash_profile和.bashrc
例:现在公司有一个《guizhangzhidu》,要求所有新员工账户中都有此文件。
[root@lala zs]# cd /etc/skel/
[root@lala skel]# ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  .mozilla
[root@lala skel]# touch gongsiguizhangzhidu.txt
[root@lala skel]# ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  gongsiguizhangzhidu.txt  .mozilla
[root@lala skel]# useradd ls
[root@lala skel]# cd /home/ls
[root@lala ls]# ls -a
.  ..  .bash_logout  .bash_profile  .bashrc  gongsiguizhangzhidu.txt  .mozilla

系统变量:对所有用户都生效,配置文件/etc/profile和/etc/bashrc 
[root@lala ls]# vim /etc/profile
写在最后一行:
export PATH=$PATH:/usr/local/httpd/conf
[root@lala ls]# source /etc/profile
[root@lala ls]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:/usr/local/httpd/bin:/usr/local/httpd/bin:/usr/local/httpd/bin:/usr/local/httpd/conf/

自定义变量:用户自己定义的变量
预定义变量:bash中内置的一类变量,不能直接修改
$#:位置变量个数
$*:位置变量内容
$?:返回上一条命令执行结果状态码,0正确 1-255错误
$0:命令字

声明变量:[varname]=[varvalues]
查看变量:echo $varname
[root@lala ~]# a=5
[root@lala ~]# echo $a

[root@lala ls]# n=(1 2 3 4)
[root@lala ls]# echo ${n[0]}
1
[root@lala ls]# echo ${n[1]}
2
[root@lala ls]# echo ${n[2]}
3
[root@lala ls]# echo ${n[3]}
4

例:
[root@lala ls]# vim /mount.sh
#!/bin/bash
#
#install mount        注释
a=/dev/cdrom
b=/media/dvd

#mount media        注释
mount $a $b

[root@lala ls]# bash /mount.sh

变量赋值的特殊操作(引号)
“ ”:可以显示变量
例:
[root@lala ls]# t318=bufang tongxie
bash: tongxie: 未找到命令...
[root@lala ls]# t318="bufang tongxie"
[root@lala ls]# echo $t318
bufang tongxie

'  '(英文单引号):强引用,引用普通字符
例:
[root@lala ls]# t217='yang $t318'
[root@lala ls]# echo $t217
yang $t318

`  `(数字键盘1,esc下面):反撇号,引用命令执行结果
例:
[root@lala ls]# ls -lh /usr/bin/tar
-rwxr-xr-x. 1 root root 338K 11月  6 2016 /usr/bin/tar
[root@lala ls]# ls -lh $(which tar)
-rwxr-xr-x. 1 root root 338K 11月  6 2016 /usr/bin/tar
[root@lala ls]# aa=$(ls -lh $(which tar))
[root@lala ls]# echo $aa
-rwxr-xr-x. 1 root root 338K 11月 6 2016 /usr/bin/tar
同等于
[root@lala ls]# ls -lh `which tar`


cat /etc/httpd/conf/httpd.conf | grep -v "^#" | grep -v "^;" | grep -v "^$"
htlist=` cat /etc/httpd/conf/httpd.conf | grep -v "^#" | grep -v "^;" | grep -v "^$"
`
echo $htlist

read:交互中,提示用户输入信息
\  :转移符,把一些特殊的字符转化成本身代表的字符,正则表达式中多用

数值变量的运算
[root@lala ~]# x=35
[root@lala ~]# y=16
[root@lala ~]# expr $x + $y
51
[root@lala ~]# expr $x - $y
19
[root@lala ~]# expr $x * $y
expr: 语法错误
[root@lala ~]# expr $x \* $y
560
[root@lala ~]# expr $x / $y
2
[root@lala ~]# expr $x % $y
3

条件判断
判断的方式两种
1、test
2、if

test:文件测试
格式1:test 表达式
格式2:[   表达式    ]             括号前后有空格

-d:是否是目录
-f:是否是文件
-r:是否具有读权限
-w:是否具有写入权限
-x:是否具有执行权限
-e:测试文件或目录是否存在
-s:是否是套接字
-c:是否是字符集设备
-b:是否是是块设备

[root@lala ~]# test -d aaa
[root@lala ~]# echo $?
1
[root@lala ~]# mkdir aaa
[root@lala ~]# test -d aaa
[root@lala ~]# echo $?
0

[root@lala ~]# [ -d /media/dvd  ]
[root@lala ~]# echo $?
0
[root@lala ~]# [ -d /media/dvd/server  ]
[root@lala ~]# echo $?
1

[root@lala ~]# [ -d /media ] && echo "yes"
yes
[root@lala ~]# [ -d /media/dvd ] && echo "yes"
因为没有/media/dvd目录,所以不输出任何结果

[root@lala ~]# [ -f aa.txt ] && echo "yes"
[root@lala ~]# touch aa.txt
[root@lala ~]# [ -f aa.txt ] && echo "yes"
yes

检查看aa.txt文件的权限
[root@lala ~]# ls -l aa.txt 
-rw-r--r--. 1 root root 0 3月   2 15:53 aa.txt
[root@lala ~]# [ -r aa.txt ] && echo "yes"
yes
[root@lala ~]# [ -w aa.txt ] && echo "yes"
yes
[root@lala ~]# [ -x aa.txt ] && echo "yes"
因为没有执行权限,所以不输出任何内容

[root@lala ~]# [ -e aa.txt ] && echo "yes"
yes
[root@lala ~]# [ -e a.txt ] && echo "yes"

整数值比较
-eq:等于
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
-ne:不等于

[root@lala ~]# [ 1 -eq 2 ]
[root@lala ~]# echo $?
1
[root@lala ~]# [ 1 -eq 1 ]
[root@lala ~]# echo $?
0

例:判断磁盘使用量
[root@lala ~]# df -hT
文件系统            类型      容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root xfs        97G  4.1G   93G    5% /
devtmpfs            devtmpfs  897M     0  897M    0% /dev
tmpfs               tmpfs     912M  144K  912M    1% /dev/shm
tmpfs               tmpfs     912M   17M  895M    2% /run
tmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sda1           xfs       197M  150M   47M   77% /boot
tmpfs               tmpfs     183M   16K  183M    1% /run/user/0
/dev/sr0            iso9660   4.1G  4.1G     0  100% /media/dvd
[root@lala ~]# df -hT | grep "/boot$"
/dev/sda1           xfs       197M  150M   47M   77% /boot
[root@lala ~]# df -hT | grep "/boot$" | awk '{print $6}'
77%
[root@lala ~]# df -hT | grep "/boot$" | awk '{print $6}' | cut -d% -f1
77
[root@lala ~]# [ $(df -hT | grep "/boot$" | awk '{print $6}' | cut -d% -f1) -ge 60 ] && echo "too many"
too many

例:判断内存
[root@lala ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1867264      581368      324024       19444      961872     1033020
Swap:       2097148           0     2097148
[root@lala ~]# free | grep "Mem:"
Mem:        1867264      581740      323652       19444      961872     1032680
[root@lala ~]# free | grep "Mem:" | awk '{print $4}'
323388
[root@lala ~]# b=$(free | grep "Mem:" | awk '{print $4}')
[root@lala ~]# [ $b -lt 500000 ] && echo ${b}MB

字符串比较
=:字符串相同
!=:字符串不同
-z:字符串是否为空

例:
[root@lala ~]# echo $LANG
zh_CN.UTF-8
[root@lala ~]# [ $LANG != "zh_CN.UTF-8" ] && echo "not Chinese" || echo "hello big China"
hello big China

例:
[root@lala ~]# read -p "Do you love me?(yes/no)" ack
Do you love me?(yes/no)yes
[root@lala ~]# [ $ack = "yes" ] && echo "I love you too" || echo "But I love you very much"
I love you too
[root@lala ~]# [ $ack = "no" ] && echo "I love you too" || echo "But I love you very much"
But I love you very much

逻辑测试
&&:逻辑与(and)
||  :逻辑或/否则(or)
! :逻辑非(取反)
例:
[root@lala ~]# [ $USER != root ] && echo "not root" || echo "hello good man"
hello good man
[root@lala ~]# [ $USER = root ] && echo "hello muhuaijun is a good man" || echo "not root"
hello muhuaijun is a good man

例:判断用户是否存在
[root@lala ~]# id 
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@lala ~]# id abc
id: abc: no such user
写一个脚本,检查用户abc是否存在,如果存在,则显示“abc is user”,如果不存在则创建
vim useradd.sh
#!/bin/bash
id abc &> /dev/null && echo "abc is user" || useradd abc

[root@lala ~]# sh useradd.sh 
[root@lala ~]# tail -1 /etc/passwd
abc:x:1001:1001::/home/abc:/bin/bash

例:
[root@lala ~]# vim disk.sh
#!/bin/bash
diskuser=`df -hT | grep "/boot$" | awk '{print $6}' | cut -d% -f1`
[ $diskuser -ge 60 ] && echo "space is low" || echo "space is much"

[root@lala ~]# sh disk.sh 
space is low

练习:
1、测试/opt/backup目录是否存在
[root@lala ~]# vim di.sh
#!/bin/bash
[ -d /opt/backup ] && echo "yes" || echo "no"

[root@lala ~]# sh di.sh 
no

2、查询当前的活动进程数,并测试是否小于100
[root@lala ~]# vim ps.sh
#!/bin/bash
pss=`ps aux | wc -l`
[ $pss -lt 100 ] && echo "yes" || echo "no"
[root@lala ~]# sh ps.sh 
no

3、测试是否已经安装sysstat软件包
[root@lala ~]# vim sys.sh
#!/bin/bash
rpm -qa sysstat &> /dev/null
a=`echo $?`
[ $a -ne 0 ] && echo "not installed" || echo "installed"

4、测试user1是否存在,若不存在则创建
[root@lala ~]# vim users2.sh
#!/bin/bash
! id user10 &> /dev/null && useradd user10 && echo "user10" | passwd --stdin "123.com" &> /dev/null || echo "user10 shigeyonghu"
! id user20 &> /dev/null && useradd user20 && echo "user20" | passwd --stdin "123.com" &> /dev/null || echo "user20 shigeyonghu"
! id user30 &> /dev/null && useradd user30 && echo "user30" | passwd --stdin "123.com" &> /dev/null || echo "user30 shigeyonghu"
! id user40 &> /dev/null && useradd user40 && echo "user40" | passwd --stdin "123.com" &> /dev/null || echo "user40 shigeyonghu"
! id user50 &> /dev/null && useradd user50 && echo "user50" | passwd --stdin "123.com" &> /dev/null || echo "user50 shigeyonghu"

5、创建用户user10
vim  usersad.sh
#!/bin/bash
! id user10 &> /dev/null && useradd user10 && echo "user10" | passwd --stdin "123.com" &> /dev/null || echo "user10 shigeyonghu"

if语句结构
if……then……:如果……那么……

单分支语法格式
if  条件测试操作        if  条件测试操作;then 命令序列
then 命令序列        fi
fi

单分支执行流程:
首先判断条件测试操作的结果,如果返回值为0,表示条件成立,则执行then后面的命令序列,一直到遇见fi结束判断为止,继续执行其他脚本代码;如果返回值不为0,则忽略then后面的命令序列,直接跳转至fi行以后执行其他脚本代码。

例:
[root@localhost ~]# vim mount.sh
#!/bin/bash
mou="/var/www/html"
if [ ! -d $mou ]
then
mkdir -p $mou
fi

例:
[root@localhost ~]# vim us.sh
#!/bin/bash
if [ $USER != "abc" ]
then
echo "abc is not user"
fi

双分支语法格式
单分支语法格式
if  条件测试操作
then 命令序列1
else  命令序列2
fi

执行流程:
首先判断条件测试操作的结果,表示条件成立,则执行then后面的命令序列1,忽略else及后面的命令序列2,直到遇见fi结束判断;如果条件不成立,则忽略then及后面的命令序列1,直接跳至else后面的命令序列2,直到遇见fi结束判断。

例:
[root@localhost www]# vim httpd.sh
#!/bin/bash
netstat -anpt | grep 80
a=`echo $?`
if [ $a -eq 0 ];then
echo "httpd is running"
else
systemctl restart httpd && echo "httpd is run!!!"
fi

例:
[root@localhost www]# vim ping.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "host $1 is up"
else
echo "host $1 is down"
fi

-c    3:只发送3个测试包
-i    0.2:间隔0.2秒
-W     3:超时3秒
$1:位置变量,如果改成$2,则要写两个ip地址,第一个不被使用,直接使用第二个

[root@localhost www]# chmod +x ping.sh 
[root@localhost www]# ./ping.sh 192.168.6.20

多分支语句结构
if  条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else  命令序列3
fi

执行流程:
首先判断条件测试操作1的结果,如果条件1成立,则执行命令序列1,然后跳至fi结束判断;如果条件1不成立,则继续判断条件测试操作2的结果,如果条件2成立,则执行命令序列2,然后跳至fi结束判断……如果所有条件都不满足,则执行then及后面的命令序列n,直接跳至else后面的命令序列2,直到遇见fi结束判断。

例:
vim name.sh
#!/bin/bash
read -p "what's your name?(xuesenwei,lianpeng,yuxinyu,boge):"  name
if [ $name = "xuesenwei" ]
then
echo "$name is pig"
elif [ $name = "lianpeng" ]
then
echo "$name is monkey"
elif [ $name = "yuxinyu" ]
then
echo "$name is dashu"
else
echo "$name is niu"
fi


[root@lala ~]# sh name.sh 
what's your name?(xuesenwei,lianpeng,yuxinyu,boge):yuxinyu
yuxinyu is dashu

例:
[root@lala ~]# vim fen.sh
#!/bin/bash
read -p "qing shu ru nin de fen shu(0-100):"    fenshu
if 
[ $fenshu -ge 85 ] && [ $fenshu -le 100 ];
then
echo "chengji is couhe"
elif
[ $fenshu -ge 70 ] && [ $fenshu -le 84 ];
then
echo "chengji is youxiu"
elif
[ $fenshu -ge 60 ] && [ $fenshu -le 69 ];
then
echo "chengji is hege"
else
echo "chengji is bujige"
fi

[root@lala ~]# sh fen.sh 
qing shu ru nin de fen shu(0-100):85
chengji is couhe
[root@lala ~]# sh fen.sh 
qing shu ru nin de fen shu(0-100):74
chengji is youxiu

loop:循环开始条件和结束条件
break:允许跳出所有循环(终止执行后面的所有循环)
continue:与break类似,只有一点差别,不会跳出所有循环,仅仅跳出当前循环

for循环:遍历所有的变量
格式:
for [varname]  in  {values } 
do  [command1]
      [command2]
done

执行流程:
首先将列表中的第一个取值赋给变量,并执行do……done循环体中的命令序列;然后将列表中的第二个取值赋给变量,并执行do……done循环体中的命令序列……直到列表中的所有取值都用完,最后跳至done语句,表示循环结束。

例:批量添加用户,并且密码为123456
vim  users.txt
liyupu
kangxiaolei
liuyi

vim useradd.sh
#!/bin/bash
a=`cat /root/users.txt` &>/dev/null
for  i in $a
do
useradd $i
echo '123456' | passwd --stdin $i &>/dev/null
echo "$i users add finished!"
done

例:根据IP地质检查主机情况
vim  ping.txt
192.168.6.10
192.168.6.20
192.168.6.30

vim  chk.sh
#! /bin/bash
a=$(cat /root/ping.txt) &>/dev/null
for i in $a
do
ping -c 3 $i &> /dev/null
if [ $? -eq 0 ];
then
echo "host $i is up"
else
echo "host $i is down"
fi
done

while:只要条件成立,执行循环
要求控制循环次数,操作对象按数字顺序编号,按特定条件执行重复操作哦情况,则更适合。

格式:
while [条件]            until
do  [command1]
      [command2]
done

执行流程:
首先判断while后的条件测试操作结果,如果成立,则执行do……done循环体中的命令序列;返回while后再次判断条件测试操作结果,如果仍然成立,则执行do……done循环体中的命令序列;再次返回到while后,判断条件测试操作结果……如此循环,直到while后的条件测试操作结果不再成立为止,最后跳转到done语句,结束循环

例:批量添加用户
vim uswhile.sh
#! /bin/bash
name="sb"
i=1
while [ $i -le 20 ]
do
useradd ${name}$i
echo '123456' | passwd --stdin ${name}$i &>/dev/null
let i++
done

例:竞猜商品价格
echo $RANDOM:随意的、任意的值      2的16次方:65535
expr $RANDOM % 1000:余数可获得0-999的随机数
times=0    次数
true:作为测试条件来实现while的循环,当用户猜中价格终止循环

[root@lala ~]# vim jiage.sh
#! /bin/bash
price=`expr $RANDOM % 1000`
times=0
echo "price is between 0-999"
while true
do
read -p "please insert your price:" int
let times++
if [ $int -eq $price ]
then
echo "price is $price"
echo "$times count"
exit 0
elif [ $int -gt $price ]
then
echo "hight"
else
echo "low"
fi
done

例:从1加到100的和
#!/bin/bash
i=1
s=0
until [ ! $i -le 100 ]
do
s=$(($i+$s))
i=$(($i+1))
done
echo "sum is:$s"

while和for对比
for开始就定义范围,所出结果就在定义的范围之内
while相当于列表,逐级递增

想要避免while进入死循环,需要exit


case:根据变量不同取值,执行不同的命令,多用于列表
格式:
case   变量值   in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
……
*)
默认命令序列
;;
esac

执行流程:
首先使用“变量值”与模式1进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号;;后跳至esac,表示结束分支。若与模式1不匹配,则继续与模式2进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号;;后跳至esac,表示结束分支……以此类推,若找不到任何匹配的值,则执行默认模式“*)”后的命令序列,直到遇见esac后结束分支。

注意:
1、case行尾必须为单词in,每一模式必须以右括号)结束
2、双分号;;表示命令序列的结束
3、模式字串中,可以用方括号表示一个连续的范围 [0-9];还可以用竖杠|表示“或”  A|B
4、最后的*)表示默认,其中*相当于通配符

例:/usr/local/httpd/bin/apachectl start
[root@lala ~]# vim httpd.sh
#!/bin/bash
case $1 in
start)
/usr/local/httpd/bin/apachectl start &>/dev/null
echo "httpd is starting"
;;
stop)
/usr/local/httpd/bin/apachectl stop &>/dev/null
echo "httpd is stoped"
;;
restart)
/usr/local/httpd/bin/apachectl restart &>/dev/null
echo "httpd is restart"
;;
*)
echo "httpd is start/stop/restart/stats"
;;
esac

[root@lala ~]# sh httpd.sh start
httpd is starting
[root@lala ~]# sh httpd.sh stop
httpd is stoped
[root@lala ~]# sh httpd.sh restart
httpd is restart
[root@lala ~]# sh httpd.sh abc
httpd is start/stop/restart/stats

例:击键类型(键盘字母类型)
[root@lala ~]# vim key.sh
#!/bin/bash
read -p "insert [0-9] or [A-Z] or [a-z]:"  key
case $key in
[0-9])
echo "shuzi"
;;
[A-Z])
echo "daxie"
;;
[a-z])
echo "xiaoxie"
;;
*)
echo "unknow"
;;
esac

[root@lala ~]# sh key.sh 
insert [0-9] or [A-Z] or [a-z]:1
shuzi
[root@lala ~]# sh key.sh 
insert [0-9] or [A-Z] or [a-z]:a
xiaoxie
[root@lala ~]# sh key.sh 
insert [0-9] or [A-Z] or [a-z]:A
daxie
[root@lala ~]# sh key.sh 
insert [0-9] or [A-Z] or [a-z]:haha
unknow

例:判断输入的内容,是yes、YES、no、NO
[root@lala ~]# vim shuru.sh
#! /bin/bash
read -p "please input [YES] or [yes] or [NO] or [no]:"  haha
case $haha in
"YES")
echo "daxieYES"
;;
"yes")
echo "xiaoxieyes"
;;
"no")
echo "xiaoxie no"
;;
"NO")
echo "daxie NO"
;;
*)
echo "haha you are wrong"
;;
esac

[root@lala ~]# sh shuru.sh 
please input [YES] or [yes] or [NO] or [no]:yes
xiaoxieyes
[root@lala ~]# sh shuru.sh 
please input [YES] or [yes] or [NO] or [no]:no
xiaoxie no
[root@lala ~]# sh shuru.sh 
please input [YES] or [yes] or [NO] or [no]:YES
daxieYES
[root@lala ~]# sh shuru.sh 
please input [YES] or [yes] or [NO] or [no]:NO
daxie NO
[root@lala ~]# sh shuru.sh 
please input [YES] or [yes] or [NO] or [no]:HAHA
hahha you are wrong

例:交互式选择用数字1/2/3代表上海、丽江、成都
[root@lala ~]# vim chengshi.sh
#! /bin/bash
echo "you want to shanghai,please input 1:"
echo "you want to liliang,please input 2:"
echo "you want to chengdu,please input 3:"
read  -t  30 -p "please input your chooise:" cho
case $cho in
"1")
echo "shanghai"
;;
"2")
echo "lijiang"
;;
"3")
echo "chengdu"
;;
*)
echo "error"
;;
esac

 -t  30:30秒之内完成输入,否则会报错(会跳至“*)”结束循环)

[root@lala ~]# sh chengshi.sh 
you want to shanghai,please input 1:
you want to liliang,please input 2:
you want to chengdu,please input 3:
please input your chooise:1
shanghai

是一种通过符号和字符串进行匹配规则的,对文件内容的查询结果进行影响。
正则表达式是由普通字符和元字符构成

常用正则:grep、sed、awk、pgrep、mkdir、touch……
touch a{1..100}.txt

[root@lala ~]# ifconfig ens33 | grep "inet 192.168.6.20 " | awk '{print $5}'
broadcast

grep组合正则表达式的用法
grep -n "ServerName" /usr/local/httpd/conf/httpd.conf 
n:显示行号,查询的指定字符串在文件中所在的行号

grep -in "ServerName" /usr/local/httpd/conf/httpd.conf 
i:显示内容不区分大小写

grep -vn "ServerName" /usr/local/httpd/conf/httpd.conf 
v:反向查询,显示不包含指定字符串的行

grep -in "Server[Nn][avty]me" /usr/local/httpd/conf/httpd.conf 
[ ] :匹配[ ]中任意字符,or的意思

grep -n "^[Ss]" /usr/local/httpd/conf/httpd.conf 
^ :以指定的字符或字符串开头

grep -n "\.$" /usr/local/httpd/conf/httpd.conf 
$ :以指定的字符或字符串结尾
注意:如果结尾为.则需要加转义符。因为.在 正则表达式中也是一个元字符,所以需要用转义符\将具有特殊意义的字符转化成普通字符

grep -n "html$" /usr/local/httpd/conf/httpd.conf 
grep -n "^$" /usr/local/httpd/conf/httpd.conf 
^$ :显示空行

grep -n "[A-Z]" /usr/local/httpd/conf/httpd.conf 
[A-Z] :连续范围的数字或字母

基础正则表达式
grep -n '[^w]oo' test.txt 
查找“oo”前不是“w”的字符串

grep -n 'wo\{1,3\}d' test.txt             o\{1,3\}
查询包含1-3个o的字符串
{ } :之前的字符重复出现指定单位数量,{ } 需要加转义符
 grep -n 'o\{2\}' test.txt             o\{2\}

正则中的通配符:
.        代替一个字符,可以连续使用,不能代表空值
*       代替一组字符,可以为空
.*    至少存在一个字符
    例:wo.*k        wook    work    woak    绝对不能是wok

grep 'r..o' /etc/passwd
查询r和o中间有2个字符的,空格算一个字符


o*换成a*,在查询“oo o*”中,必须以oo成对出现的,而在查询“ooo o*”,必须以ooo成对出现
如果是“o o*”,则第一个o必须存在,第二个o是零个或者多个,所以包含o、oo、ooo、oooo、……
若查询“oo o*”,查询两个o以上的字符串。搜索关键字是两a。包含oo、ooo、oooo、……
若查询“ooo o*”,查询三个o以上的字符串。包含ooo、oooo、……

grep -n 'ooo*' /etc/passwd.old 
查询两个o以上的字符串

grep -n '.*' /etc/passwd.old
所有都出现

扩展正则表达式
egrep -n 'woo+d' test.txt 
+   :筛选一个或一个以上字符

 egrep -n 'ooo?' test.txt 
?  查询?前一个有或没有的字符

egrep -n 'o?' test.txt 
查询没有或有一个以上o的字符串
egrep -n 'oo?' test.txt 
查询一个或有一个以上o的字符串
egrep -n 'ooo?' test.txt 
查询两个或有两个以上o的字符串

egrep -n 'name|Name' /usr/local/httpd/conf/httpd.conf 
查询文件中与两个字符串相同的内容

egrep -n 'name|Name' /usr/local/httpd/conf/httpd.conf 
( )查询文件中两种字符相同的内容


sed
可以在命令行状态直接对文件内容进行修改

sed -i '1a#chkconfig:35 25 25' /usr/local/httpd/conf/httpd.conf 
a:在指定的行号后添加一行内容

sed -i '/#ServerName/a \192.168.100.100' /usr/local/httpd/conf/httpd.conf 
在#ServerName的下一行添加192.168.100.100

p:输出符合条件的文本内容
sed -n '90p' /usr/local/httpd/conf/httpd.conf
查看第90行内容

sed -n '90,100p' /usr/local/httpd/conf/httpd.conf
查看第90-100行内容

sed -n '$=' /usr/local/httpd/conf/httpd.conf
显示文件总行数

d:删除文件中指定的行数
sed -i '/apache/d' /usr/local/httpd/conf/httpd.txt
删除带有指定字符串的行

sed -i '/apache/!d' /usr/local/httpd/conf/httpd.txt
删除不包含指定字符串的所有行

sed -i '/^#/d' /usr/local/httpd/conf/httpd.txt
删除所有#开头的行

sed -i '/^$/d' /usr/local/httpd/conf/httpd.txt
删除所有空行

s:修改指定文件中的内容
sed -i 's/server/SERVERLO1/' /a.txt 
将每行的第一个字符串进行修改

sed -i 's/server/SERVERLO1/3' /a.txt 
后面的数字3代表将每行的第几个同名字符串进行修改


sed -i '/server/c \#haha' /a.txt 
替换指定字符串所在的行

awk
awk -F:     '{print $1}'    /etc/passwd
分割符,默认为空格分割符。将文件的每一行的第一个字段分割出来

awk '{print}' /a.txt         =  cat /a.txt
awk '{print $0}' /a.txt     =  cat /a.txt

awk 'NR==1,NR==3{print $0}' /a.txt 
awk '(NR>=1)&&(NR<=3){print}' /a.txt 
输出第一到第三行内容

 awk 'NR==1||NR==3{print}' /a.txt 
输出第一和第三行内容

awk '(NR%2)==0{print}' /a.txt 
输出所有偶数行内容
awk '(NR%2)==1{print}' /a.txt 
输出所有奇数行内容

awk '/^root/{print}' /etc/passwd
输出以root开头的行

awk '/nologin$/{print}' /etc/passwd
输出以nologin结尾的行

awk 'BEGIN{X=0};/\/bin\/bash$/{x++};END{print x}' /etc/passwd
=grep -c “bin\/bash$”
统计以bin\/bash结尾的行数
 

发表评论:

Copyright Your WebSite.Some Rights Reserved.