shell循环和函数

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

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
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: shell