Shell变量赋值

read 进行赋值  

1. read的脚本中示例语法

[root@shell01 /scripts]# cat read-1.sh
#!/bin/bash
read -p "请输入一个值:" Var
echo "你输入的变量值为:$Var "
[root@shell01 /scripts]# sh  read-1.sh
请输入一个值:oldboy
你输入的变量值为:oldboy 


2. read简单备份场景

    1. 提示用户输入要备份的目录
    2. 告知用户要备份的目录是什么
    3. 备份目录 
    4. 告知用户目录备份完成

[root@shell01 /scripts]# cat read-2.sh
#!/bin/bash
read -p "请输入你要备份的目录:" Dir
echo "你要备份的目录为:$Dir"
echo "正在备份$Dir ............"
echo  "目录$Dir 备份完成......."
[root@shell01 /scripts]# sh read-2.sh
请输入你要备份的目录:/script
你要备份的目录为:/script
正在备份/script ............
目录/script 备份完成.......


3. 测试用户输入的IP地址是否能通

    1. 提示用户输入IP地址
    2. 根据用户输入的IP地址进行测试  ping -c1 -W1  10.0.0.2
    3. 根据测试的结果,返回给用户,通的就返回通,不通就返回不通

#第一种方法
[root@shell01 /scripts]# cat read-3.sh
#!/bin/bash
#1.提示用户输入一个IP地址
read -p "请输入一个IP地址进行测试连通情况:" Ip
#2.根据用户输入的IP地址进行测试,将测试结果返回给用户
ping -c1 -W1 $Ip  &>/dev/null && echo "该IP地址$Ip 是通畅的!" || echo "该IP地址$Ip 是不通的!"

[root@shell01 /scripts]# sh  read-3.sh 
请输入一个IP地址进行测试连通情况:10.0.0.7
该IP地址10.0.0.7 是通畅的!
[root@shell01 /scripts]# sh  read-3.sh 
请输入一个IP地址进行测试连通情况:10.0.0.100
该IP地址10.0.0.100 是不通的!

#第二种方法
[root@shell01 /scripts]# cat read-4.sh
#!/bin/bash
#1.提示用户输入一个IP地址
read -p "请输入一个IP地址进行测试连通情况:" Ip
#2.根据用户输入的IP地址进行测试
ping -c1 -W1 $Ip  &>/dev/null
#3.根据测试结果返回给用户
if [ $? -eq 0 ];then
    echo "该IP地址$Ip 是通畅的!"
else
    echo "该IP地址$Ip 是不通的!"
fi
[root@shell01 /scripts]# sh read-4.sh
请输入一个IP地址进行测试连通情况:10.0.0.254
该IP地址10.0.0.254 是通畅的!
[root@shell01 /scripts]# sh read-4.sh
请输入一个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]# cat read-4.sh
#!/bin/bash
#1.提示用户输入一个IP地址
read -p "请输入一个IP地址进行测试连通情况:" Ip
#2.根据用户输入的IP地址进行测试
ping -c1 -W1 $Ip  &>/dev/null
#3.根据测试结果返回给用户
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]# cat read-5.sh
#!/bin/bash
#1.提示用户输入新的主机名
read -p "请输入你要修改之后的主机名:" Hostname
#2. 提示用户是否确认修改主机名
read -p "请确认是否真正的修改主机名[yes|no]:" Qr
#3. 根据用户的输入进行是否修改主机名
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]# sh read-5.sh
请输入你要修改之后的主机名:shell
请确认是否真正的修改主机名[yes|no]:no
你选择了不修改主机名....
程序脚本退出............
[root@oldboy /scripts]# sh read-5.sh
请输入你要修改之后的主机名:shell
请确认是否真正的修改主机名[yes|no]:yes
你选择了修改主机名.....
主机名修改成功......
[root@shell scripts]# source  /etc/profile

5. 写个脚本,修改主机IP地址

    1. 提示用户输入新的IP地址

    2. 提示用户是否真的修改IP地址

    3. 修改IP地址,提示用户IP地址修改成功

    4. 怎么生效,重启网络服务,IP地址修改之后,远程连接会断开

    5. 怎么修改IP地址,10 和 172 网段都要修改

自己写:

[root@shell /scripts]# cat read-6.sh
#!/bin/bash
#1. 提示用户输入新的IP地址的主机位
read -p "请输入你要修改之后的IP地址的主机位:" Host
#2. 提示用户是否确认修改IP地址的主机位
read -p "是否确认修改主机的IP地址[yes|no]:" Qr
#3. 根据用户的输入进行判断是否修改IP地址
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]# sh read-6.sh
请输入你要修改之后的IP地址的主机位:180
是否确认修改主机的IP地址[yes|no]:no
你选择不修改IP地址,再见!
[root@shell /scripts]# sh read-6.sh
请输入你要修改之后的IP地址的主机位:180
是否确认修改主机的IP地址[yes|no]:yes
你选择了修改主机的IP地址.....
主机的IP地址修改成功!
是否确认重启网络服务进行生效![yes|no]:no
你没有选择重启网络服务!你可以选择手动重启!
[root@shell /scripts]# sh read-6.sh
请输入你要修改之后的IP地址的主机位:170
是否确认修改主机的IP地址[yes|no]:yes
你选择了修改主机的IP地址.....
主机的IP地址修改成功!
是否确认重启网络服务进行生效![yes|no]:yes
你选择了重启网络服务生效!注意:重启之后,当前连接会断开,需要使用新的IP地址进行连接。

Shell变量替换

变量 说明
${#变量} 获取变量的长度
${变量#匹配规则} 从头开始匹配,最短删除
${变量##匹配规则} 从头开始匹配,最长删除
${变量%匹配规则} 从尾开始匹配,最短删除
${变量%%匹配规则} 从尾开始匹配,最长删除
${变量/旧的字符串/新的字符串} 替换变量中的旧的字符串为新的字符串,只替换第一个
${变量//旧的字符串/新的字符串} 替换变量中的旧的字符串为新的字符串,替换所有
${变量:匹配规则:匹配规则} 索引及切片

[root@shell /scripts]# url=www.sina.com.cn        #定义变量
[root@shell /scripts]# echo $url                #打印变量
www.sina.com.cn
[root@shell /scripts]# echo ${#url}                #获取变量值的长度
15
[root@shell /scripts]# echo ${url#*.}        #从头开始匹配,最短删除,*表示所有,点没有任何含义
sina.com.cn
[root@shell /scripts]# echo ${url##*.}        #从头开始匹配,最长删除
cn

[root@shell /scripts]# echo ${url%.*}        #从尾开始匹配,最短删除
www.sina.com
[root@shell /scripts]# echo ${url%%.*}        #从尾开始匹配,最长删除
www

[root@shell /scripts]# echo ${url/w/W}        #将旧的字符串替换为新的字符串,只替换第一个字符串
Www.sina.com.cn
[root@shell /scripts]# echo ${url//w/W}        #将旧的字符串替换为新的字符串,替换所有
WWW.sina.com.cn
[root@shell /scripts]# echo ${url/w/}        #将第一个匹配到w删除
ww.sina.com.cn
[root@shell /scripts]# echo ${url//w/}        #将所有匹配到w删除
.sina.com.cn

[root@shell /scripts]# echo $url                #打印变量
w  w  w  .  s  i  n  a  .  com.cn

0  1  2  3  4  5  6  7  8  9

[root@shell /scripts]# echo ${url:0:3}        #从0列开始匹配,切出3列   0-2列
www

[root@shell /scripts]# echo ${url:5:4}        #从5列开始匹配,切出4列, 5-8
ina.
[root@shell /scripts]# echo ${url:5}        #切除前5列  0-4列删除
ina.com.cn

变量替换案例

1. 查看当前内存的使用率,如果使用率大于80%,则进行报警。

    1. 怎么查看内存的使用情况   free  -m  

    2. 怎么获取已使用的内存使用率 

    3. 怎么进行对比,使用率大于80  ,获取整数

    4. 根据判断,返回结果,大于80则报警,正常就正常提示


[root@shell /scripts]# cat free_use.sh
#!/bin/bash
#1.定义内存使用率的大小变量
Free_Used=$(free  -m | awk '/^Mem/{print $3/$2*100}')
#2. 拿内存的使用率大小跟80进行比较
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]# sh free_use.sh
当前内存使用率过高!使用率为:81.0101%
[root@shell /scripts]# sh free_use.sh
当前内存使用率正常!使用率为: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]# cat back_etc.sh
#!/bin/bash
#1. 定义相关变量
Back_Dir=/backup
Ip=$(ifconfig eth0 |awk 'NR==2{print $2}')
Date=$(date +%F)
#2. 判断备份目录是否存在,如果不存在则创建
[ -d $Back_Dir ] || mkdir -p $Back_Dir
#3. 开始备份
cd / && tar czf $Back_Dir/${Date}_${Ip}_etc.tar.gz  etc  &>/dev/null
#4. 判断备份是否成功
if [ $? -eq 0 ];then
    echo "/etc/目录备份成功......"
else
    echo "/etc/目录备份失败......"
fi
[root@shell /scripts]# sh back_etc.sh
/etc/目录备份成功......
[root@shell /scripts]# ll /backup/
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]# touch /oldboy/test{01..10}.txt
[root@shell /scripts]# touch /oldboy/test{01..10}.log
[root@shell /scripts]# ll /oldboy/
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]# cat mv.sh
#!/bin/bash
#1.把所有以.txt为结尾的文件重命名为.txt.bak
find /oldboy/ -type f -name "*.txt" | sed -r 's#(.*)#mv \1 \1.bak#g' | bash &>/dev/null
#2. 判断重命名是否成功
if [ $? -eq 0 ];then
    echo "所有.txt结尾的文件全部重命名为.txt.bak成功......"
else
    echo "重命名失败!"
    exit
fi
#3. 把所有.bak为结尾的文件进行打包压缩
cd /oldboy && tar czf  bak.tar.gz  $(find /oldboy -type f -name "*.bak")  &>/dev/null
#4. 判断是否打包压缩成功
if [ $? -eq 0 ];then
    echo "所有以.bak为结尾的文件打包压缩成功........"
else
    echo "打包压缩失败!"
    exit
fi
#5. 还原名称
find /oldboy -type f -name "*.bak" | sed -r 's#(.*)(\.bak)#mv \1\2 \1#g' | bash &>/dev/null
#6. 判断还原名称是否成功
if [ $? -eq 0 ];then
    echo "所有.bak为结尾的文件还原名称为.txt成功........"
else
    echo "还原名称失败!"
    exit
fi
[root@shell /scripts]# ll /oldboy/
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]# sh mv.sh 
所有.txt结尾的文件全部重命名为.txt.bak成功......
所有以.bak为结尾的文件打包压缩成功........
所有.bak为结尾的文件还原名称为.txt成功........
[root@shell /scripts]# ll /oldboy/
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]# tar tf /oldboy/bak.tar.gz 
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
Copyright © 高程程 all right reserved,powered by Gitbook修订于: 2021-05-18 21:14:44

results matching ""

    No results matching ""