linux基础shell脚本

shell脚本基础

1、更改输出颜色

默认会追加下一条命令的颜色

[root@localhost data]# echo -e '\033[31m 6666'

image.png

1.1使用[0m来避免追加
[root@localhost data]# echo -e '\033[31m 6666 \033[0m'

image.png
31m是红色,32m是绿色

[root@localhost data]# echo -e '\033[42m \033[31m 6666 \033[0m'

image.png

[root@localhost data]# echo -e '\033[41m \033[33m 6666 \033[0m'

image.png

找出以根结尾的硬盘使用情况

[root@localhost data]# df -hT |grep /$

告诉你整个硬盘的分区情况

[root@localhost data]# fdisk -l
2、重定向与管道符

输出错误信息

[root@localhost ~]# ifconffig 2> /data/1.txt
[root@localhost ~]# cat /data/1.txt
bash: ifconffig: 未找到命令...
相似命令是: 'ifconfig'
3、awk过滤操作
3.1awk默认靠空格区分

过滤出IP地址

[root@localhost ~]# ifconfig ens33 |grep inet |grep -v inet6 |awk  '{print $2}'
192.168.116.130

写个显示网络基本信息的脚本

#!/bin/bash
echo -e '\033[31m IP地址(IPADDR)\033[0m'
ifconfig ens33 |grep inet |grep -v inet6 |awk  '{print $2}'
echo -e '\033[31m 子网掩码(NETMASK)\033[0m'
ifconfig ens33 |grep inet |grep -v inet6 |awk  '{print $4}'
echo -e '\033[31m 路由(GETWAY) \033[0m'
route -n |grep UG |awk '{print $2}'                                  

linux基础shell脚本_第1张图片

3.2awk-F可以指定以什么分割

比如这里使用.分割来筛选出IP地址的第一段

[root@localhost data]# ifconfig ens33 |grep inet |grep -v inet6 |awk  '{print $2}'|awk -F. '{print $1}'

image.png
通或者提取硬盘使用占比的具体数字

[root@localhost data]# df -hT |grep /$|awk '{print $6}' |awk -F% '{print $1}'

linux基础shell脚本_第2张图片

4、变量
4.1获取键盘输入
#!/bin/bash
read -p "ip address:" IP
echo $IP

image.png

5、单双引号的区别

双引号会识别 符号,并读取 符号,并读取 符号,并读取号中变量的值
单引号不会识别,直接输出

[root@localhost data]# A1=chaitin
[root@localhost data]# A2=2023
[root@localhost data]# A3="$A1"+"$A2"+"Happy"
[root@localhost data]# echo $A3
chaitin+2023+Happy
[root@localhost data]# A3="$A1""$A2""Happy"
[root@localhost data]# echo $A3
chaitin2023Happy


[root@localhost data]# A3='$A1 $A2 Happy'
[root@localhost data]# echo $A3
$A1 $A2 Happy
6、反撇会执行对应的命令
[root@localhost data]# A4=`df -hT |grep /$`
[root@localhost data]# echo $A4
/dev/mapper/centos-root xfs 30G 6.5G 24G 22% /
7、括号也能执行对应的命令
[root@localhost data]# A5=$(ifconfig ens33 |grep inet |grep -v inet6)
[root@localhost data]# echo $A5
inet 192.168.116.133 netmask 255.255.255.0 broadcast 192.168.116.255
8、设置全局变量

修改环境变量或者要进入子进程时要添加export

[root@localhost data]# export A6="wen"
[root@localhost data]# bash
[root@localhost data]# echo $A6
wen

普通变量在其他bash环境中无法执行,而全局变量能正常执行

9、运算

注意乘号与正常的不同

10、位置变量

会读取脚本后所有的位置变量,并带入到脚本进行执行
linux基础shell脚本_第3张图片

设计一个小脚本

#!bin/bash
echo 开始 $0
tar zcf /data/test.tar.gz $*
echo 目录: $*
echo 个数: $#

linux基础shell脚本_第4张图片

11、屏蔽脚本运行时的命令原本的输出
&> /dev/null
#!/bin/bash
echo 开始 $0
tar zcf /data/test.tar.gz $* &> /dev/null
echo 目录: $*
echo 个数: $#
test=$?

linux基础shell脚本_第5张图片

编写一个一键配置yum的脚本

1、将sr0挂载到对应的目录
#!/bin/bash
umount /dev/sr0
mount /dev/sr0 /media/
rm -rf /etc/yum.repos.d/*.repo
echo "[test-sh]" >> /etc/yum.repos.d/test.repo
echo "name=test" >> /etc/yum.repos.d/test.repo
echo "baseurl=file:///media" >> /etc/yum.repos.d/test.repo
echo "enabled=1" >> /etc/yum.repos.d/test.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/test.repo
yum clean all
yum makecache

编写一个一键安装DHCP的脚本

#!/bin/bash
umount /dev/sr0
mount /dev/sr0 /media/
rm -rf /etc/yum.repos.d/*.repo
echo "[test-sh]" >> /etc/yum.repos.d/test.repo
echo "name=test" >> /etc/yum.repos.d/test.repo
echo "baseurl=file:///media" >> /etc/yum.repos.d/test.repo
echo "enabled=1" >> /etc/yum.repos.d/test.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/test.repo
yum clean all
yum makecache

read -p "IP网段:" NET
read -p "子网掩码:" NETMASK
read -p "DHCP起始地址:" RANG1
read -p "DHCP终止地址:" RANG2
read -p "DNS地址1:" DNS1
read -p "DNS地址2:" DNS2
read -p "网关:" GETEWAY
read -p "广播地址:" BROADCAST

echo "# A slightly different configuration for an internal subnet" > /etc/dhcp/dhcpd.conf
echo "subnet $NET  netmask $NETMASK {" >> /etc/dhcp/dhcpd.conf
echo "range $RANG1 $RANG2;" >> /etc/dhcp/dhcpd.conf
echo "option domain-name-servers $DNS1,$DNS2;" >> /etc/dhcp/dhcpd.conf
echo 'option domain-name "internal.example.org";' >> /etc/dhcp/dhcpd.conf
echo "option routers $GETEWAY;" >> /etc/dhcp/dhcpd.conf
echo "option broadcast-address $BROADCAST;" >> /etc/dhcp/dhcpd.conf
echo "default-lease-time 600;" >> /etc/dhcp/dhcpd.conf
echo "max-lease-time 7200;" >> /etc/dhcp/dhcpd.conf
echo "}" >> /etc/dhcp/dhcpd.conf


systemctl start dhcpd

linux基础shell脚本_第6张图片

想要变量带上双引号,需要做嵌套

shell判断

1、文件判断

命令成立,返回值为0

2、判断是否存在.repo结尾的文件
[root@localhost data]# [ -e  /etc/yum.repos.d/*.repo ]
[root@localhost data]# echo $?
0
[root@localhost data]#
5、if语句
5.1单分支结构
if [ -e  /etc/yum.repos.d/*.repo ]
  then
  echo 存在.repo结尾的文件
fi
5.2双分支结构
if [ -e  /etc/yum.repos.d/*.repo ]
  then
  echo 存在.repo结尾的文件
  else 不存在.repo结尾的文件
fi

检查网络连通性

#!/bin/bash
net=`curl cip.cc -s|grep http |awk -F/ '{print $4}'` #使用反撇来让脚本执行命令;-s来取消统计信息
if [ $net -z  ] &> /dev/null			#判断命令是否执行成功,如果执行成功。返回值应该有东西
then
echo -e '\033[41m \033[33m 网络连接错误 \033[0m'		#没有东西证明执行错误
else
echo -e '\033[42m \033[31m 网络连接正常,您的IP地址是:\033[0m' $net
fi 

判断是否安装dhcp

rpm -q dhcp
echo $?			#如果返回0,则证明安装成功
5.3多分支结构
#!/bin/bash
read -p "请输入你的成绩:" A1
if [ $A1 -ge 85 ]
then
echo good!
elif [ $A1 -lt 85 ] && [ $A1 -ge 60 ]
then
echo 及格!
else
echo 不及格!
fi
6、正则
#!/bin/bash
read -p "请输入您要判断的IP地址:" IP
echo $IP > /data/ipaddr
echo $IP |grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" > /dev/null
if [ $? -eq 0 ]
then
echo 000.000.000.000-999.999.999.999
else
echo -e '\033[31m ip address error \033[0m'
fi
6.1判断IP地址是否合法以及是几类地址
#!/bin/bash
read -p "请输入您要判断的IP地址:" IP
echo $IP > /data/ipaddr
echo $IP |grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" > /dev/null
if [ $? -eq 0 ]
then

A=`awk -F. '{printf $1}' /data/ipaddr`
B=`awk -F. '{printf $2}' /data/ipaddr`
C=`awk -F. '{printf $3}' /data/ipaddr`
D=`awk -F. '{printf $4}' /data/ipaddr`
        if [ $A -ge 1 ] && [ $A -le 255 ] && [ $B -ge 1 ] && [ $B -le 255 ] && [ $C -ge 1 ] && [ $C -le 255 ] && [ $D -ge 1 ] && [ $D -le 255 ]
        then
                if [ $A -ge 1 ] && [ $A -le 126 ]
                then
                echo -e '\033[42m \033[31m 该IP为A类地址!\033[0m'
                elif [ $A -ge 128 ] && [ $A -le 191 ]
                then
                echo -e '\033[42m \033[31m 该IP为B类地址!\033[0m'
                elif [ $A -ge 192 ] && [ $A -le 223 ]
                then
                echo -e '\033[42m \033[31m 该IP为C类地址!\033[0m'
                else [ $A -ge 224 ] && [ $A -le 255 ]
                echo -e '\033[42m \033[31m 该IP为D类地址!\033[0m'
                fi
        else
        echo -e '\033[31m ip地址大于255不符合规定! \033[0m'
        fi
else
echo -e '\033[31m ip地址不合法 \033[0m'
fi
~                                                                                                                       ~         
6.2exit 1 表示错误终止

shell循环

1、while循环
1.1写一个从1一直循环到100的while循环
#!/bin/bash
i=1
while [ $i -le 100 ]
do
echo $i
let i++         #let也是用于计算的,对整数进行计算
done
1.2猜数字
#!/bin/bash
i=0
JG=`expr $RANDOM % 1000`  #$random:产生一个随机值
while true
do
let i++
read -p "你猜的数字是:" INT
if [  $INT -eq $JG ]
then
echo -e '\033[42m \033[31m 恭喜你猜对了! \033[0m'
echo "你猜了"$i"次"
exit 0                          #表示终止运行
elif [ $INT -gt $JG ]
then
echo "猜大了"
else
echo "猜小了"

fi
done

linux基础shell脚本_第7张图片

2、for循环
#!/bin/bash
for i in "httpd mysql dhcp samba"
do
rpm -e $i --nodeps &     #--nodeps卸载时忽略依赖关系检查
done
~           
2.1使用cat读取文件内容赋值到循环

linux基础shell脚本_第8张图片

2.2判断奇偶数
#!/bin/bash
for i in 23 24 45 66
do
a1=$(expr $i % 2)
if [ $a1 -eq 1 ]
then
echo $i 为奇数
else
echo $i 为偶数
fi
done
~          

linux基础shell脚本_第9张图片

正则

^ :匹配开头(^h)
$ :匹配结尾(h$)
. :单个任意字符
* :匹配*左边的表达式0次或者多次
+ :匹配+左边的表达式1次或者多次
\ :使右侧正则符号失去含义,变为字符
[] : 范围选择匹配符,匹配的信息由中括号内的内容代替
	[^]:反选 
	[a-z]:匹配小写a-z 
	[0-9]:匹配数字0-9
	[A-Z]:匹配大写A-Z	
	^[a-zA-Z]:匹配开头是字母的
	[a-z]$:以字母结尾
	^[a-z]$:这一行都是小写字母
 	[|]"|":多个信息中匹配某一个
	[-]"-":匹配一个范围
{}:匹配左侧表达式的个数,在shell中需要使用\来进行转义\{\} 
{n} :
{n,} :
{n,m} :
\t :横向制表符,tab大空格
\n :换行符号![image.png](https://cdn.nlark.com/yuque/0/2023/png/22710349/1673671404177-8c360649-693d-4a69-988e-c124038b91b2.png#averageHue=%23bab4a1&clientId=uc1d24786-9cf4-4&from=paste&height=768&id=u03740001&originHeight=768&originWidth=1440&originalType=binary&ratio=1&rotation=0&showTitle=false&size=388883&status=done&style=none&taskId=u01085ad8-4c49-4e47-93c9-f15b69ad739&title=&width=1440)
-n :显示行号
-i :忽略大小写

你可能感兴趣的:(安全基础,linux,服务器,运维)