shell脚本循环语句,函数和数组

今天呢我来浅谈一下三个概念,如题,了解这三种概念对于我们shell脚本的编写是非常有帮助的。

咱们一个一个来说:

shell脚本的循环语句

在工作中,当老板让你创建一批账号用来分发给新员工,可能有几十几百人,那自然不可能useradd一个一个创建,不仅效率低下容易出错,而且浪费我们的时间,那么我们就可以借用脚本呢来实现自动化的创建。

当老板给了你名单要让你用这份名单去创建用户时,那么我们可以用for循环语句来编写脚本,

for循环语句

因为for语句最大的特点就是有取值列表,名单就相当于用户列表。那么可以编写如下:

#!/bin/bash      声明解释器
ULIST=$(cat /root/users.list)  将取值列表定义为ULIST变量
for uname in $ULIST       定义要循环的值要在取值列表中取
  do
    useradd   $uname    创建用户
    echo "123456" | passwd --stdin $uname &>/dev/null   重定向输入密码,可以免交互,输出的信息不想看,定向到黑洞设备。

  done

你只需要跑一下该程序就可以自动创建名单用户,很省事。

注意事项:for从取值列表中取出一个值,赋予变量然后执行命令,结束后再从开头执行重复操作,直到取值列表值被取完———中间不能有空值。

while循环语句

当老板之说了要创建一批用户做备用,没有取值列表,那么就需要用到while循环,来创建用户了。具体用法如下:

#!/bin/bash
RPE="name"  创建出的用户前缀为name
i=1
while [ $i -le 30 ]   创建小于等于30的账号
  do
    userdel -r  ${RPE}$i   用户名
    echo "123456" | passwd --stdin ${RPE}$i &>/dev/null   重定向免交互
    let i++     i的数值累加一
  done

将用户命名为“”nameX"X为按照累加一的正整数,通过这种方式你只需要改变-le后的数字就可以控制创建多少个账号。

注意事项:while的条件测试语句一定要保证正确,否则会陷入死循环。

untile循环语句

该循环用的不多,除了特殊情况。该语句时满足条件时退出循环。

比如说要求一百以内的和;可编写如下脚本:

求100以内数的和
#!/bin/bash
i=0;s=0  定义两个变量
until [ $i -eq 100 ]
  do
    let "i=$i+1";let "s=$s+$i"  计算过程
 done
  echo 'sum(1..100)=' $s  得出结果

一般用until能解决的用while也能解决。在这里不过多赘述。

函数

  • shell函数

    • 存放一系列指令

    • 在执行脚本的过程中,函数被置于内存,因此调用较快。

    • 函数的类型

      • 无参函数

        • #!/bin/bash
          zhangsan() {   定义函数名
          echo "mynameiszhangsan"   {}内时函数指令
          echo "nihao"
          }
          lisi() {
          echo "mynameislisi"
          echo "nihao"
          }
          zhangsan调用函数
          • 定义了zhangsan,lisi两个函数

            • 末尾的zhangsan表示调用该函数

      • 函数内存在参数

        • #!/bin/bash
          i=2
          
          aaa() {
                  local i    将变量i作为局部变量,只在aaa这个函数内生效
                  i=1
                  echo $i
          
          }
          aaa
          echo $i
          • 在函数内变量前将其定义为局部变量加local

      • 递归函数

        • [root@localhost ~]# vim fun_recursion.sh
          #!/bin/bash 
          function factorial {   定义了一个名为factorial的函数
          	if [ $1 -eq 1 ] 
          	then 
          		echo 1 
          	else 
          		local temp=$[ $1 - 1 ] 
          		local result=$(factorial $temp)   在这里自己调用自己
          		echo $[ $result * $1 ] 
          	fi
          } 
           
          read -p "Enter value: " value 
          result=$(factorial $value) 
          echo "The factorial of $value is: $result" 
          • 函数内调用函数

当一组指令被反复的书写,我们就可以将这类指令归纳为函数库,方便我们调用,以及减少书写量。 

数组
  • 数组是变量的一种类型,数组中有几个概念需要我们理清:

    • $*与$@的区别

      • $*整体

      • $@,单独个体,遍历

      • 需要加“”

    • 数组名=(值 值 值 )定义数组的方式 值与值之间用空格隔开

      • 定义:一般不改动

    • 获取数组长度

      • 数组名=${#数组名[ *]}

    • 读取某下标值

      • 数组名=${数组名[ 下标号]}

    • 数组切片

      • 数组名=${数组名[@]:开始:几个}

    • 数组替换

      • 数组名=${数组名[]/旧/新}

        • 旧针对的是值而不是位 且是全部替换

    • 数组删除

      • unset 数组名[删第几个]

      • unset 数组名  整组删除

以上为shell脚本在centos7中所书写的方式,规则等。

如有任何疑问欢迎下方留言,看到会及时解答。 

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值