shell变量替换以及变量运算基础

1.shell变量替换 **

${变量#匹配规则}            从头开始匹配,最短删除
${变量##匹配规则}            从头开始匹配,最长删除
${变量%匹配规则}            从尾开始匹配,最短删除
${变量%%匹配规则}            从尾开始匹配,最长删除
${变量/旧字符串/新字符串}    替换字符串,仅替换第一个
${变量//旧字符串/新字符串}    替换字符串,替换全部

例1:从前往后删变量内容
    Qh_url=mirrors.tuna.tsinghua.edu.cn
    echo $Qh_url
    echo ${Qh_url#*.}    #删除.分隔的第一个字段
    echo ${Qh_url##*.}  #仅保留最后一个字段
    
例2:从后往前删变量内容
    Qh_url=mirrors.tuna.tsinghua.edu.cn
    echo $Qh_url
    echo ${Qh_url%.*}    #删除最后一个字段
    echo ${Qh_url%%.*}    #仅保留第一个字段
    
例3:变量内容替换
    Qh_url=mirrors.tuna.tsinghua.edu.cn
    echo $Qh_url
    echo ${Qh_url/u/U}
    echo ${Qh_url//u/U}
    


脚本题:
1、把/data下所有.txt文件,改名.bak,并tar包备份到/backup,最后解压还原文件名
mkdir /data  
touch /data/file{1..9}.txt 

vim rename.sh
#!/bin/bash
File_txt=$(find /data -type f -iname "*.txt" |xargs > /data/txt.f)
for a in $(cat /data/txt.f)
do
    mv $a $a.bak
done 

tar zcf /backup/file.tar.gz  /data/*.bak

File_txt=$(find /data -type f -iname "*.bak" |xargs > /data/bak.f)
for b in $(cat /data/bak.f)
do
    mv $b ${b%.*}
done

2、定义变量,happiness="towards the sea, with spring flowers blossoming,the the"
    执行脚本,输出变量,并要求:
    1) 打印变量值字符串长度
    2) 删除所有的the
    3) 替换第一个the为that
    4) 替换所有the为that
    用户按“1|2|3|4” ,输出相应选项内容。
    
vim happiness.sh    **
#!/bin/bash
happiness="towards the sea, with spring flowers blossoming,the the"

echo $happiness

cat <<EOF
1) 打印happiness长度
2) 删除所有的the
3) 替换第一个the为that
4) 替换所有the为that
EOF

read -p "请输入数字 1|2|3|4,或    q|Q: " var

if [ $var == q ];then
    exit
fi

if [ $var == Q ];then
    exit
fi

if [ $var -eq 1 ];then
    echo "当前happiness变量的长度是:${#happiness}"
fi

if [ $var -eq 2 ];then
    echo ${happiness//the/}
fi

if [ $var -eq 3 ];then
    echo ${happiness/the/that}
fi

if [ $var -eq 4 ];then
    echo ${happiness//the/that}
fi


======================================
shell变量运算

1.整数运算,expr、$(())、$[],不支持小数运算 **

a+b     加
a-b        减
a*b     乘(expr计算时,用 \* )
a/b     除
a%b     余 

例1:
    a=20
    b=10
    expr $a + $b 
    echo $(( $a + $b ))
    echo $[ $a + $b ]
    
例2:递增和递减
    echo $((a++))
    echo $((a--))
    echo $((++b))
    echo $((--b))
    echo $((100*(1+100)/2))        求1到100之和
    
    
2. 小数运算,bc工具 *
yum -y install bc 

echo "2*4" |bc 
echo "2^4" |bc
echo "scale=2;3/2" |bc 
awk 'BEGIN{print 3/2}'


脚本题:
例1:查看内存使用率,仅保留整数
vim mem_use.sh    ***
#!/bin/bash
Mem_use=$(free -m |grep ^M |awk '{print $3/$2*100}')
if [ ${Mem_use%.*} -ge 80 ];then
    echo "memory is overfull: ${Mem_use%.*}%"
else
    echo "memory is OK: ${Mem_use%.*}%"
fi 

例2:脚本输出系统版本、内核版本平台、虚拟平台、主机名、网卡ip


例3:查看磁盘使用状态,使用率超出80%就报警
思路:
    怎么查看磁盘
    怎么提取使用率
    整数判断
    
vim disk_use.sh    ***
#!/bin/bash
Disk=$(df -h |grep /$ |awk '{print $(NF-1)}')

if [ ${Disk%\%} -ge 80 ];then
    echo "你的磁盘使用率过高:$Disk"
else 
    echo "你的磁盘使用率正常:$Disk"
fi