shell循环和函数

1.for循环

for循环是固定循环,也就是在循环时就已经知道需要进行几次的循环,有事也把for循环成为计数循环。for的语法如下两种:
语法一

for 变量 in 值1 值2 值3 …(可以是一个文件等)
	do
		程序
	done
	
	这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。
	也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,以此类推。

语法二

for (( 初始值;循环控制条件;变量变化 ))
	do
		程序
	done
	
语法二中需要注意:
初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;

循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;

变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1。

语法一举例

vim test1.sh
#!/bin/bash
#打印时间

for time in morning   afternooon  evening
  do
    echo "This time is $time"
done      

##执行脚本
[root@tdm1 ~]# bash test1.sh 
This time is morning
This time is afternooon
This time is evening

语法一举例:批量压缩脚本

[root@localhost ~]$ vim test2.sh
#!/bin/bash
#批量解压缩脚本

cd/lamp
#进入压缩包目录
ls *.tar.gz > ls.log
#把所有.tar.gz结尾的文件的文件覆盖到ls.log 临时文件中
for i in $(cat ls.log) `
#或者这样写for i in `cat ls.log`

#读取ls.log文件的内容,文件中有多少个值,就会循环多少次,每次循环把文件名赋予变量i
	do
		tar -zxf $i &>/dev/null
		#加压缩,并把所有输出都丢弃
	done
rm -rf /lamp/ls.log
#删除临时文件ls.log

语法二举例:从1加到100

vim test3.sh
#!/bin/bash
#从1加到100
s=0
for ((i=1;i<=100;i=i+1))
do
  s=$(( $s+$i ))
done
echo "1+2+3+..+100总和为$s"

##执行脚本
[root@tdm1 ~]# bash test3.sh 
1+2+3+..+100总和为5050

语法二举例:批量添加指定数量用户

vim test4.sh
#!/bin/bash
#输入用户名,保存变量
read -p "please input user name: " -t 30 name
#输入添加用户的数量,保存变量
read -p "please input the number of users " -t 30 num
#输入密码,保存变量
read -p "please input the password for users: " -t 30 pass

#判断三个变量不为空
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
#执行循环
then
    for  (( i=1; i<=$num; i=i+1 ))
       do
         #添加用户,用户名为$name$i,产生的输出到垃圾桶
         useradd $name$i >>/dev/null 2>&1
         #设置密码
         echo $pass | passwd --stdin $name$i >>/dev/null 2>&1
       done
else
    #三个变量有一个为空,则退出
    echo " wrong ! exit !"
fi

##执行脚本
[root@tdm1 ~]# bash test.sh 
please input user name: test
please input the number of users 5
please input the password for users: 123456
[root@tdm1 ~]# cat  /etc/passwd |  grep test
test1:x:1000:1000::/home/test1:/bin/bash
test2:x:1001:1001::/home/test2:/bin/bash
test3:x:1002:1002::/home/test3:/bin/bash

语法二举例:批量删除用户

vim test5.sh
#!/bin/bash
#批量删除用户
#读取文件信息,awk切割出用户名
user=$( cat /etc/passwd | grep test | awk -F ":" '{print $1}' )
#循环,有多少用户,循环多少次
for i in $user
  do
    #删除用户
    userdel -r $i
  done

##执行脚本
[root@tdm1 ~]# bash test5.sh
[root@tdm1 ~]# cat /etc/passwd  | grep test
[root@tdm1 ~]# 

2.while循环

对while循环来讲,只要条件判断式成立,循环就一直会继续,直到条件判断式不成立,循环才会停止。

语法

while [ 条件判断式 ]
	do
		程序
	done

案例:1加到100

vim test6.sh
#!/bin/bash
#从1加到100
#给变量赋值
i=1
s=0
#如果变量i的值小于100,则执行循环
while [ $i -le 100 ]
do
  s=$(( $s+$i ))
  i=$(( $i+1 ))
done
echo "This sum is $s"

##执行脚本
[root@tdm1 ~]# bash test6.sh 
This sum is 5050

案例:输入的数值进行比较

vim test7.sh
#!/bin/bash
price=$(( $RANDOM % 10 ))
times=0
echo "商品的价格在0-10之间,猜猜是多少?"
while true
do
  read -p "请输入您猜的价格: " num
  let times++
    if [ $num -eq $price ]
      then
        echo "您猜对了,价格是$price"
        echo "您总共猜了$times次"
      exit 0
    elif [ $num -gt $price ]
      then
        echo "太高了!"
      else
        echo "太低了!"
    fi
done

##执行脚本
[root@tdm1 ~]# bash test7.sh 
商品的价格在0-10之间,猜猜是多少?
请输入您猜的价格: 5
太低了!
请输入您猜的价格: 7
太高了!
请输入您猜的价格: 6
您猜对了,价格是6
您总共猜了3次

3.until循环

和while循环相反,until循环是只要判断式成立则进行循环,一旦判断式成立,则终止循环。

语法:

until [ 条件判断式 ]
	do
		程序
	done

案例:1加到100

vim test8.sh
#!/bin/bash
i=1
s=0
#循环直到i大于100,就停止循环
until  [ $i -gt 100 ]
do
  s=$(( $s + $i ))
  i=$(( $i + 1))
done
echo "This sum is $s"

##执行脚本
[root@tdm1 ~]# bash test8.sh 
This sum is 5050

4.函数

语法:

function 函数名 () {
	程序
}

案例:接受用户输入的数字,然后从1加到这个数字

vim test9.sh
!/bin/bash
#定义函数
sum() {
   s=0
   for (( i=0;i<=$num;i=i+1 ))
     do
       s=$(( $i + $s ))
   done
     echo "1+2+3+..+$num: $s"
}

#接收用户输入的数字,并把值赋予变量num
read -p "please input  a  number: " -t 30 num

#把变量num的值替换为空,并赋予变量y
y=$( echo $num | sed 's/[0-9]//g'  )

#判断变量y是否为空,以确定变量num中是否为数字
if [ -z $y  ]
  then
     #调用sum函数,并把变量num的值作为第一个参数传递给sum函数
     sum $sum
  else
     #如果变量num 的值不是数字,则输出报错信息
     echo "error,please input a  number!"
fi

##执行脚本
[root@tdm1 ~]# bash test9.sh 
please input  a  number: 10
1+2+3+..+10: 55

5.特殊流程控制语句

exit语句
系统是有exit命令的,用于退出当前用户的登录状态。可是在Shell脚本中,exit语句是用来退出当前脚本的。也就是说,在Shell脚本中,只要碰到了exit语句,后续的程序就不再执行,而直接退出脚本
exit语法如下

exit [返回值]

如果exit命令之后定义了返回值,那么这个脚本执行之后的返回值就是我们自己定义的返回值。可以通过查询$?这个变量,来查看返回值。
exit例子

vim test10.sh
#!/bin/bash
read -p "please input a number: " -t 30 num
#接收用户输入的数字,并把值赋予变量num
y=$( echo $num | sed 's/[0-9]//g')

#判断变量y是否为空,以确定变量num中是否为数字
if [ -z $y ]
then
    echo "this number is $num"
else
    echo "error,please input a number"
    exit 15
fi

##执行脚本
[root@tdm1 ~]# bash test10.sh 
please input a number: b
error,please input a number
[root@tdm1 ~]# echo $?
15

break语句
当程序执行到break语句时,会结束整个当前循环。而continue语句也试结束循环的语句,不过continue语句式单次当前循环,而下次循环会继续。
案例:

vim test11.sh
#!/bin/bash
#循环十次
for  ((i=1; i<=10; i=i+1))
do
  #如果变量i的值等于4
  if [ $i -eq 4 ]
    then
      #跳出循环
      break
  fi
 echo $i
done   

##执行脚本
[root@tdm2 ~]# bash  test11.sh 
1
2
3

continue语句
continue也是结束流程控制的语句。如果在循环中,continue语句只会结束单次当前循环

vim test12.sh
#!/bin/bash
#循环十次
for  ((i=1; i<=10; i=i+1))
do
  #如果变量i的值等于4
  if [ $i -eq 4 ]
    then
      #跳出循环
      continue
  fi
 echo $i
done   

##执行脚本  脚本遇到4,结束本次循环,继续下次
[root@tdm1 ~]# bash test12.sh 
1
2
3
5
6
7
8
9
10
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值