Shell变量赋值
read 进行赋值
1. read的脚本中示例语法
[root@shell01 /scripts]
#!/bin/bash
read -p "请输入一个值:" Var
echo "你输入的变量值为:$Var "
[root@shell01 /scripts]
请输入一个值:oldboy
你输入的变量值为:oldboy
2. read简单备份场景
1. 提示用户输入要备份的目录
2. 告知用户要备份的目录是什么
3. 备份目录
4. 告知用户目录备份完成
[root@shell01 /scripts]
#!/bin/bash
read -p "请输入你要备份的目录:" Dir
echo "你要备份的目录为:$Dir"
echo "正在备份$Dir ............"
echo "目录$Dir 备份完成......."
[root@shell01 /scripts]
请输入你要备份的目录:/script
你要备份的目录为:/script
正在备份/script ............
目录/script 备份完成.......
3. 测试用户输入的IP地址是否能通
1. 提示用户输入IP地址
2. 根据用户输入的IP地址进行测试 ping -c1 -W1 10.0.0.2
3. 根据测试的结果,返回给用户,通的就返回通,不通就返回不通
[root@shell01 /scripts]
#!/bin/bash
read -p "请输入一个IP地址进行测试连通情况:" Ip
ping -c1 -W1 $Ip &>/dev/null && echo "该IP地址$Ip 是通畅的!" || echo "该IP地址$Ip 是不通的!"
[root@shell01 /scripts]
请输入一个IP地址进行测试连通情况:10.0.0.7
该IP地址10.0.0.7 是通畅的!
[root@shell01 /scripts]
请输入一个IP地址进行测试连通情况:10.0.0.100
该IP地址10.0.0.100 是不通的!
[root@shell01 /scripts]
#!/bin/bash
read -p "请输入一个IP地址进行测试连通情况:" Ip
ping -c1 -W1 $Ip &>/dev/null
if [ $? -eq 0 ];then
echo "该IP地址$Ip 是通畅的!"
else
echo "该IP地址$Ip 是不通的!"
fi
[root@shell01 /scripts]
请输入一个IP地址进行测试连通情况:10.0.0.254
该IP地址10.0.0.254 是通畅的!
[root@shell01 /scripts]
请输入一个IP地址进行测试连通情况:10.0.0.2
该IP地址10.0.0.2 是不通的!
echo命令的特性:输出颜色
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
[root@shell01 /scripts]
#!/bin/bash
read -p "请输入一个IP地址进行测试连通情况:" Ip
ping -c1 -W1 $Ip &>/dev/null
if [ $? -eq 0 ];then
echo -e "\033[32m该IP地址$Ip 是通畅的!\033[0m"
else
echo -e "\033[31m该IP地址$Ip 是不通的!\033[0m"
fi
4. 写一个脚本,修改主机名
1. 提示用户输入新的主机名
2. 提示用户是否确认修改主机名
3. 修改主机名
4. 根据修改的结果进行判断
5. 修改成功之后,让其立即生效
[root@oldboy /scripts]
#!/bin/bash
read -p "请输入你要修改之后的主机名:" Hostname
read -p "请确认是否真正的修改主机名[yes|no]:" Qr
if [ "$Qr" == "yes" ];then
echo "你选择了修改主机名....."
hostnamectl set-hostname $Hostname &>/dev/null
if [ $? -eq 0 ];then
echo "主机名修改成功......"
bash
else
echo "主机名修改失败......"
fi
else
echo "你选择了不修改主机名...."
echo "程序脚本退出............"
fi
[root@oldboy /scripts]
请输入你要修改之后的主机名:shell
请确认是否真正的修改主机名[yes|no]:no
你选择了不修改主机名....
程序脚本退出............
[root@oldboy /scripts]
请输入你要修改之后的主机名:shell
请确认是否真正的修改主机名[yes|no]:yes
你选择了修改主机名.....
主机名修改成功......
[root@shell scripts]
5. 写个脚本,修改主机IP地址
1. 提示用户输入新的IP地址
2. 提示用户是否真的修改IP地址
3. 修改IP地址,提示用户IP地址修改成功
4. 怎么生效,重启网络服务,IP地址修改之后,远程连接会断开
5. 怎么修改IP地址,10 和 172 网段都要修改
自己写:
[root@shell /scripts]
#!/bin/bash
read -p "请输入你要修改之后的IP地址的主机位:" Host
read -p "是否确认修改主机的IP地址[yes|no]:" Qr
if [ "$Qr" == "yes" ];then
echo "你选择了修改主机的IP地址....."
sed -ri "s#(^IPADDR.*\.).*#\1$Host#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] &>/dev/null
if [ $? -eq 0 ];then
echo "主机的IP地址修改成功!"
read -p "是否确认重启网络服务进行生效![yes|no]:" Con
if [ "$Con" == "yes" ];then
echo "你选择了重启网络服务生效!注意:重启之后,当前连接会断开,需要使用新的IP地址进行连接。"
systemctl restart network &>/dev/null
if [ $? -ne 0 ];then
echo "重启网络服务失败!"
fi
else
echo "你没有选择重启网络服务!你可以选择手动重启!"
fi
else
echo "主机的IP地址修改失败!"
fi
else
echo "你选择不修改IP地址,再见!"
fi
[root@shell /scripts]
请输入你要修改之后的IP地址的主机位:180
是否确认修改主机的IP地址[yes|no]:no
你选择不修改IP地址,再见!
[root@shell /scripts]
请输入你要修改之后的IP地址的主机位:180
是否确认修改主机的IP地址[yes|no]:yes
你选择了修改主机的IP地址.....
主机的IP地址修改成功!
是否确认重启网络服务进行生效![yes|no]:no
你没有选择重启网络服务!你可以选择手动重启!
[root@shell /scripts]
请输入你要修改之后的IP地址的主机位:170
是否确认修改主机的IP地址[yes|no]:yes
你选择了修改主机的IP地址.....
主机的IP地址修改成功!
是否确认重启网络服务进行生效![yes|no]:yes
你选择了重启网络服务生效!注意:重启之后,当前连接会断开,需要使用新的IP地址进行连接。
Shell变量替换
| 变量 |
说明 |
| ${#变量} |
获取变量的长度 |
| ${变量#匹配规则} |
从头开始匹配,最短删除 |
| ${变量##匹配规则} |
从头开始匹配,最长删除 |
| ${变量%匹配规则} |
从尾开始匹配,最短删除 |
| ${变量%%匹配规则} |
从尾开始匹配,最长删除 |
| ${变量/旧的字符串/新的字符串} |
替换变量中的旧的字符串为新的字符串,只替换第一个 |
| ${变量//旧的字符串/新的字符串} |
替换变量中的旧的字符串为新的字符串,替换所有 |
| ${变量:匹配规则:匹配规则} |
索引及切片 |
[root@shell /scripts]
[root@shell /scripts]
www.sina.com.cn
[root@shell /scripts]
15
[root@shell /scripts]
sina.com.cn
[root@shell /scripts]
cn
[root@shell /scripts]
www.sina.com
[root@shell /scripts]
www
[root@shell /scripts]
Www.sina.com.cn
[root@shell /scripts]
WWW.sina.com.cn
[root@shell /scripts]
ww.sina.com.cn
[root@shell /scripts]
.sina.com.cn
[root@shell /scripts]
w w w . s i n a . com.cn
0 1 2 3 4 5 6 7 8 9
[root@shell /scripts]
www
[root@shell /scripts]
ina.
[root@shell /scripts]
ina.com.cn
变量替换案例
1. 查看当前内存的使用率,如果使用率大于80%,则进行报警。
1. 怎么查看内存的使用情况 free -m
2. 怎么获取已使用的内存使用率
3. 怎么进行对比,使用率大于80 ,获取整数
4. 根据判断,返回结果,大于80则报警,正常就正常提示
[root@shell /scripts]
#!/bin/bash
Free_Used=$(free -m | awk '/^Mem/{print $3/$2*100}')
if [ ${Free_Used%.*} -ge 80 ];then
echo -e "\033[31m当前内存使用率过高!使用率为:${Free_Used}%\033[0m"
else
echo -e "\033[32m当前内存使用率正常!使用率为:${Free_Used}%\033[0m"
fi
[root@shell /scripts]
当前内存使用率过高!使用率为:81.0101%
[root@shell /scripts]
当前内存使用率正常!使用率为:5.10101%
2. 每天进行备份/etc/目录,将其备份到/backup目录,需要打包备份,压缩包名为:2020-02-20_Ip_etc.tar.gz
1. 备份/etc/目录
2. 备份到哪里 /backup
3. 使用什么方式 打包压缩备份 2020-02-20_Ip_etc.tar.gz
4. 备份的周期 每天
[root@shell /scripts]
#!/bin/bash
Back_Dir=/backup
Ip=$(ifconfig eth0 |awk 'NR==2{print $2}')
Date=$(date +%F)
[ -d $Back_Dir ] || mkdir -p $Back_Dir
cd / && tar czf $Back_Dir/${Date}_${Ip}_etc.tar.gz etc &>/dev/null
if [ $? -eq 0 ];then
echo "/etc/目录备份成功......"
else
echo "/etc/目录备份失败......"
fi
[root@shell /scripts]
/etc/目录备份成功......
[root@shell /scripts]
total 9988
-rw-r--r-- 1 root root 10224028 2020-02-20 16:10 2020-02-20_10.0.0.170_etc.tar.gz
3. 在/oldboy目录下,存在很多文件,找出所有以.txt为结尾的文件
1. 批量的修改所有以.txt为结尾的文件重命名为.txt.bak
2. 把所有的以.bak的文件打包压缩
3. 批量还原.bak的文件重名为.txt
[root@shell /scripts]
[root@shell /scripts]
[root@shell /scripts]
total 0
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test01.log
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test01.txt
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test10.txt
[root@shell /scripts]
#!/bin/bash
find /oldboy/ -type f -name "*.txt" | sed -r 's#(.*)#mv \1 \1.bak#g' | bash &>/dev/null
if [ $? -eq 0 ];then
echo "所有.txt结尾的文件全部重命名为.txt.bak成功......"
else
echo "重命名失败!"
exit
fi
cd /oldboy && tar czf bak.tar.gz $(find /oldboy -type f -name "*.bak") &>/dev/null
if [ $? -eq 0 ];then
echo "所有以.bak为结尾的文件打包压缩成功........"
else
echo "打包压缩失败!"
exit
fi
find /oldboy -type f -name "*.bak" | sed -r 's#(.*)(\.bak)#mv \1\2 \1#g' | bash &>/dev/null
if [ $? -eq 0 ];then
echo "所有.bak为结尾的文件还原名称为.txt成功........"
else
echo "还原名称失败!"
exit
fi
[root@shell /scripts]
total 0
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test01.log
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test01.txt
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test02.log
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test10.log
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test10.txt
[root@shell /scripts]
所有.txt结尾的文件全部重命名为.txt.bak成功......
所有以.bak为结尾的文件打包压缩成功........
所有.bak为结尾的文件还原名称为.txt成功........
[root@shell /scripts]
total 4
-rw-r--r-- 1 root root 201 2020-02-20 16:42 bak.tar.gz
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test01.log
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test01.txt
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test02.log
-rw-r
-rw-r--r-- 1 root root 0 2020-02-20 16:24 test10.txt
[root@shell /scripts]
oldboy/test01.txt.bak
oldboy/test02.txt.bak
oldboy/test03.txt.bak
oldboy/test04.txt.bak
oldboy/test05.txt.bak
oldboy/test06.txt.bak
oldboy/test07.txt.bak
oldboy/test08.txt.bak
oldboy/test09.txt.bak
oldboy/test10.txt.bak