快速了解shell编程语言,及shell脚本编写使用(3)

5 篇文章 0 订阅
5 篇文章 2 订阅

shell脚本编程(3)——函数及中断控制、字符串处理、变量初始值处理

这一章主要写的是shell的函数及中断控制、字符串处理、变量初始值处理,能够快速了解shell脚本中的一些常用的技能,能够快速掌握shell中的一些快捷功能(* ^ - ^ *)

一、函数及中断控制

1、关于函数的认识
  • 什么是shell函数
    – 在shell环境中,将一些需要重复使用的操作,定义为公共的语句块,即为函数
  • 使用函数的好处
    – 使脚本代码更简洁、增强易读性
    – 提高shell脚本的执行效率
  • 服务脚本中的函数应用
    – 适用于比较复杂的启动/终止控制操作
    – 方便在需要时多次调用
2、函数的定义与调用
  • 函数的格式:2种
    在这里插入图片描述

  • 函数的调用
    – 调用已定义的函数 (先定义了才能调用,就好比脚本的“内部命令”)
    格式:函数名

    – 函数传值 (传递的值作为函数的“位置参数”)
    格式:函数名 值1 值2 … …

函数使用案例1: 测试一个网段的IP是否ping通,ping通输出“IP is up”,不通输出“IP is down”

[root@svr5 ~]\# vim myping.sh
#!/bin/bash
xixi(){
    ping -c1 -W1  $1  &>/dev/null    //-W 指超时间隔,毫秒
    if [ $? -eq 0 ];then
        echo "$1 is up"
    else
        echo "$1 is down"
    fi
}
for  i  in  {1..254}
do
     xixi  192.168.4.$i  &
done
wait                          //wait命令的作用是等待所有后台进程都结束才结束脚本。

函数使用案例2: shell版fork炸弹(递归死循环,可迅速耗尽系统资源,慎用)

[root@svr5 ~]\# vim test.sh
#!/bin/bash
.()            //定义一个名为 . 的函数
{             //函数块开始
.|.&          //在后台递归调用函数 .
}            //函数块结束
;            //与下一条执行行语句的分隔
.            // 再次调用函数
3、中继及退出
  • 中断、退出、继续的相关指令
类型含义
break跳出当前所在的循环体,执行循环体后的语句块
continue跳过循环体内余下的语句,重新判断条件以决定是否需要执行下一次循环
exit退出脚本,默认的返回值为0
  • 三种用法案例:
    break 案例: 随意输入整数(0结束)并求和,输出最终结果
[root@svr5 ~]\# vim break.sh 
#!/bin/bash
SUM=0                                   // 定义SUN=0
while :                                 //将所有指令循环
do 
read  -p  "请输入整数(0表示结束):"  x
   [ $x -eq 0 ]  &&  break 
                                        //当输入x为0,则结束循环
SUM=$[SUM+x]
                                        //计算每个变量的和
done
echo "总和是:$SUM"

continue 案例: 找出1~2000范围内的6的倍数,不是6的倍数跳过

[root@svr5 ~]\# vim continue.sh 
#!/bin/bash
for i in {1..2000}
do
        x=$[i%6]
    [ $x -ne 0 ]  &&  continue
    echo $[i]
done

exit: 案例: 利用位置参数获取2个整数,计算出这两个整数的和,如果参数不够2个,则提示正确用法并退出脚本

[root@svr5 ~]\# vim exit.sh
#!/bin/bash
if [ $# -ne 2 ];then
 echo "用法:$0 num1 num2"
 exit 10                          //退出脚本,返回值设为10
 fi
 expr $1 + $2 

二、 字符串处理

1、子串截取
  • 格式:${变量名:起始位置 :长度}
  • 起始位置,默认从0开始,可以省略
[root@svr5 ~]\# phone="13788768897"
[root@svr5 ~]\# echo ${phone:0:6}
137887
或
[root@svr5 ~]\# echo ${phone::6}
137887
  • 使用${}方式截取字符串时,起始位置是从0开始的
    子串截取案例: 在62个字符里输出一个8位随机的密码
#!/bin/bash
x=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789          //所有密码的可能性是26+26+10=62(0-61是62个数字)
pass=''
for i in {1..8}
do
num=$[RANDOM%62]        //RANDOM获取随机数
tmp=${x:num:1}          //得到1个随机字符
pass=${pass}$tmp       //不断将得到的字符保存在pass中
done
echo $pass             // 8次循环之后,得到随机字符串
2、子串替换(两种用法)
  • 只替换第一个匹配结果:${变量名/old/new}
a=123
echo ${a/1/2}   将1替换为2
a=112233
echo ${a/1/2}    将1替换为2,只替换1次
  • 替换全部匹配结果:${变量名//old/new}
a=111222333
echo ${a//1/2}
echo ${a/11/22}
a=112233
echo ${a//1/}   //将所有的1换为空
3、插头去尾
  • 从左向右,最短匹配删除:${变量名*关键词}
  • 从左向右,最长匹配删除:${变量名##*关键词}
  • 从右向左,最短匹配删除:${变量名%关键词*}
  • 从右向左,最长匹配删除:${变量名%%关键词*}
    案例1: 以上的每个情况
[root@svr5 ~]\# A=`head -1 /etc/passwd`
[root@svr5 ~]\# echo $A                 //定义一个变量
root:x:0:0:root:/root:/bin/bash

1、[root@svr5 ~]\# echo ${A#*:}    
x:0:0:root:/root:/bin/bash            //删除从左侧第1个字符到最近的关键词“:”的部分, 
2、[root@svr5 ~]\# echo ${A##*:}
/bin/bash                            //删除从左侧第1个字符到最远的关键词“:”的部分:
3、[root@svr5 ~]\# echo ${A%:*}
root:x:0:0:root:/root               //删除从右侧最后1个字符到往左最近的关键词“:”的部分,
4、[root@svr5 ~]\# echo ${A%%:*}
root                               //删除从右侧最后1个字符到往左最远的关键词“:”的部分:

案例2: 批量修改当前目录下的文件扩展名,将.doc改为.txt。

#!/bin/bash
#使用移动文件方法修改后缀名:
for i in `ls *.txt`          //找到所有txt文件,交给for循环
do
n=${i%.*}                    //去掉扩展名,留下文件名
mv $i $n.doc                 //将原始文件改为文件名+.doc
done
#改良后:想要的参数,执行脚本时,输入参数即可
#!/bin/bash
for i in `ls *.$1`
do
        n=${i%.*}
        mv $i $n.$2
done

综合案例3: 执行脚本后,输入整数x,求从1到x的和;
当用户未输入值(直接回车)时,为了避免执行出错,应为x赋初值1

#!/bin/bash
read -p "请输入一个正整数:" x
x=${x:-1}
i=1; SUM=0
while [ $i -le $x ]
do
    let SUM+=i
    let i++
done
echo "从1到$x的总和是:$SUM"

四、变量初始值处理

1、初值的检测及设置
  • $ {x :- y} :- 当x变量存在并为非空时 输出x值,否则输出字符串y
  • 取值 ${x:-30}
    • 当变量x存在时并且值为非空,则输出$x的值
    • 当变量X不存在或者为空的时候,则输出字符串30
      案例
[root@sver5~]\# x=10
[root@sver5~]\# echo ${x:-haha}
10                              //变量x定义了值则输出x值
[root@sver5~]\# unset x
[root@sver5~]\# echo ${x:-haha}
haha                           //变量x未定义值,则输出提供的字符串

案例:输入一个正整数x ,求1~x的和,若用户未输入值,则赋初始值x=1 ,b避免执行出错

[root@sver5~]\# vim sumx.sh
#!/bin/bash
read -p "请输入一个正整数:" x
x=${x:-1}
i=1;SUM=0
while [ $i -le $x ] 
do
        let SUM+=i
        let i++
done
echo "从1到$x的总和是:$SUM"


[root@zwk ~]\# ./sumx.sh 
请输入一个正整数:10
从1到10的总和是:55

[root@zwk ~]\# ./sumx.sh 
请输入一个正整数:222
从1到222的总和是:24753

[root@zwk ~]\# ./sumx.sh 
请输入一个正整数:100000
从1到100000的总和是:5000050000

结束啦
这篇的基本介绍就先写到这里,后面会继续更新shell脚本的一些常用的用法以及后面企业中一些实用的shell脚本的运用,感谢你们的浏览,也希望对你们有所帮助,你的点赞是我努力的动力,谢谢你们!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值