今天呢我来浅谈一下三个概念,如题,了解这三种概念对于我们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中所书写的方式,规则等。
如有任何疑问欢迎下方留言,看到会及时解答。