shell变量替换
${变量#匹配规则} #从头开始匹配,最短删除
${变量##匹配规则} #从头开始匹配,最长删除
${变量%匹配规则} #从尾开始匹配,最短删除
${变量%%匹配规则} #从尾开始匹配,最长删除
${变量/旧字符串/新字符串} #替换字符串,仅替换第一个
${变量//旧字符串/新字符串} #替换字符串,替换全部
例1:从前往后删变量内容
1. [root@daxia ~]# Url=z3.www.baidu.com.cn 2. [root@daxia ~]# echo $Url 3. z3.www.baidu.com.cn 4. [root@daxia ~]# echo ${Url#*.} #删除以 . 分割的第一个字段 5. www.baidu.com.cn 6. [root@daxia ~]# echo ${Url##*.} #仅保留最后一个字段 7. cn
例2:从后往前删变量内容
1. [root@daxia ~]# echo $Url 2. z3.www.baidu.com.cn 3. [root@daxia ~]# echo ${Url%.*} #删除最后一个字段 4. z3.www.baidu.com 5. [root@daxia ~]# echo ${Url%%.*} #仅保留第一个字段 6. z3
例3:变量内容替换
1. [root@daxia ~]# echo $Url 2. z3.www.baidu.com.cn 3. [root@daxia ~]# echo ${Url/z3/l4} #替换第一个z3为l4 4. l4.www.baidu.com.cn 5. [root@daxia ~]# echo ${Url//z3/l4} #替换全部z3为l4 6. l4.www.baidu.com.cn
脚本题: 把/data下所有.txt文件,改名.bak,并tar包备份到/backup,最后解压还原文件名。合并起来做可能不理解,分开后尝试一下。
1. [root@daxia ~]# mkdir /data 2. [root@daxia ~]# mkdir /backup 3. [root@daxia ~]# touch /data/file{1..9}.txt 4. [root@daxia ~]# vim rename.sh 5. #!/bin/bash 6. File_txt=$(find /data -type f -iname "*.txt" |xargs > /data/txt.f) 7. for a in $(cat /data/txt.f) 8. do 9. mv $a $a.bak 10. done 11. 12. tar zcf /backup/file.tar.gz /data/*.bak 13. 14. File_txt=$(find /data -type f -iname "*.bak" |xargs > /data/bak.f) 15. for b in $(cat /data/bak.f) 16. do 17. mv $b ${b%.*} 18. done 19. 20. 21. #执行脚本 22. [root@daxia ~]# sh rename.sh 23. tar: 从成员名中删除开头的“/”
定义变量
happiness="towards the sea, with spring flowers blossoming,the the" 执行脚本,输出变量,并要求:
- 打印变量值字符串长度
- 删除所有的the
- 替换第一个the为that
- 替换所有the为that 用户按“1|2|3|4” ,输出相应选项内容,q|Q 退出
1. [root@daxia ~]# vim test1.sh 2. #!/bin/bash 3. happiness="towards the sea, with spring flowers blossoming,the the" 4. 5. echo $happiness 6. 7. cat <<EOF 8. 1) 打印happiness长度 9. 2) 删除所有的the 10. 3) 替换第一个the为that 11. 4) 替换所有the为that 12. EOF 13. 14. read -p "请输入数字 1|2|3|4,或 q|Q: " var 15. 16. if [ $var == q ];then 17. exit 18. fi 19. 20. if [ $var == Q ];then 21. exit 22. fi 23. 24. if [ $var -eq 1 ];then 25. echo "当前happiness变量的长度是:${#happiness}" 26. fi 27. 28. if [ $var -eq 2 ];then 29. echo ${happiness//the/} 30. fi 31. 32. if [ $var -eq 3 ];then 33. echo ${happiness/the/that} 34. fi 35. 36. if [ $var -eq 4 ];then 37. echo ${happiness//the/that} 38. fi
shell变量运算
整数运算
expr、$(())、$[],不支持小数运算
a+b 加 a-b 减 a*b 乘(expr计算时,用 * ) a/b 除 a%b 余
例1:
1. [root@daxia ~]# a=20 2. [root@daxia ~]# b=10 3. [root@daxia ~]# expr $a + $b 4. 30 5. [root@daxia ~]# echo $(($a+$b)) 6. 30 7. [root@daxia ~]# echo $[$a+$b] 8. 30
例2:递增和递减
1. [root@daxia ~]# echo $((a++)) #表示先打印变量a,然后在加一位数值变成21, 2. 20 3. [root@daxia ~]# echo $((a--)) 4. 21 5. [root@daxia ~]# echo $((++b)) #表示先加一位数值,在打印变量 6. 11 7. [root@daxia ~]# echo $((--b)) 8. 10 9. [root@daxia ~]# echo $((100*(1+100)/2)) #求1加到100的和 10. 5050
小数运算
bc加”|“管道符使用,可以将前面打印的结果给bc工具处理。
1. [root@daxia ~]# yum -y install bc #安装bc工具 2. 3. [root@daxia ~]# echo "2*4" 4. 2*4 5. [root@daxia ~]# echo "2*4" | bc 6. 8 7. [root@daxia ~]# echo "2^4" | bc 8. 16 9. [root@daxia ~]# echo "scale=2;3/2" | bc 10. 1.50 11. [root@daxia ~]# awk 'BEGIN{print 3/2}' #awk也可以计算 12. 1.5
脚本题: 例1:查看内存使用率,仅保留整数
1. [root@daxia ~]# vim mem.sh 2. #!/bin/bash 3. Mem_use=$(free -m |grep ^M |awk '{print $3/$2*100}') 4. if [ ${Mem_use%.*} -ge 80 ];then 5. echo "memory is overfull: ${Mem_use%.*}%" 6. else 7. echo "memory is OK: ${Mem_use%.*}%" 8. fi 9. 10. [root@daxia ~]# sh mem.sh 11. memory is OK: 47%
例2:查看磁盘使用状态,使用率超出80%就报警 思路: 怎么查看磁盘 怎么提取使用率 整数判断
1. [root@daxia ~]# vim disk.sh 2. 3. #!/bin/bash 4. Disk=$(df -h |grep /$ |awk '{print $(NF-1)}') 5. 6. if [ ${Disk%\%} -ge 80 ];then 7. echo "你的磁盘使用率过高:$Disk" 8. else 9. echo "你的磁盘使用率正常:$Disk" 10. fi 11. 12. [root@daxia ~]# sh disk.sh 13. 你的磁盘使用率正常:31%