shell循环和函数

2023-09-14 20:22:11

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
更多推荐

Layui快速入门之第十三节 日期与时间选择器

目录一:基本用法API渲染属性弹出提示2.8+获取实例2.8+解除实例绑定2.8+关闭日期面板2.7+获取某月的最后一天二:常规用法三:多类型选择器四:范围选择五:直接静态显示六:更多功能示例一:基本用法Layui是一个基于jQuery的前端UI框架,它提供了众多的组件和工具,其中包括日期选择器组件。在Layui中使用

同为科技(TOWE)专业防雷滤波桌面PDU超级插座

2023年第19届杭州亚运会开幕在即,相较于以往,本届杭州亚运会的一大看点就是电竞项目将首次以正式比赛项目的身份亮相亚运赛场,让更多受众能够领略电竞的魅力。当前社会,电竞作为一种新兴的娱乐、社交方式,让很多年轻人通过高科技设备的便捷和高效,在游戏中展示自己的技能和策略,与志同道合的朋友一起体验团队合作的乐趣,从而展现自

2023华为杯研究生数学建模选题建议和获奖助攻

先说一下自己的看法吧,明天会分享点干货以及赛题的思路给大家!查看文末名片即可!很多同学都是第一次参加数学建模比赛,尤其是含金量最高的华为杯,所以在没有经过系统的学习数学建模知识体系的情况下,大家在拿到题目之后,一定要慎重选题,你要确保你选择的题目是可以在四天内完成的!大家可以看一下华为杯去年的赛题题型A题是华为题,与华

外贸遇到同事撞单怎么处理

有时候感觉这个世界太小了,小到我们经常和自己的同事撞单,甚至很纳闷为什么客户会同时联系我们公司的那么多人,是如何联系上的。比如刚毕业的时候,我曾经开发过一个埃及的客户,每次他回复邮件的时候都会带着我们公司很多其他同事的邮箱。当时公司的规定是谁先给客户发送的开发信或者是客户第一次回复谁的邮件来将客户归为谁管理,其他的同事

类和对象(下)

前言:前面两篇文章我们一共讲述了类和对象的六个默认成员函数,这篇文章我们将接着继续讲。一、再谈构造函数:1.1构造函数体赋值:虽然调用构造函数之后,对象中已经有一个初始值,但是我哦们不能将这称之为对象成员变量的初始化,我们只能将其称之为赋值。因为初始化只能初始化一次,而构造函数体可以进行多次赋值。1.2初始化列表:初始

后端字典的优雅设计

背景今天讲到的是数据字典的设计。为什么要讲到这个呢,因为我下午在做开发的时候遇到了一个问题。我先扔出来某个表的字段的定义吧:business_typeintdefault0comment'0:收款计划;1:付款计划'而且我还有一个字典表,字典表的结构大约是这样的:dict_codeCodeValuebusiness_t

C++ 基础(十二)函数-题目练习

一、等差数列求和描述编写一个函数sum(…),计算等差数列中前n项数据的和。已知等差数列的起始项为2。例如:等差数列2,5,8,11…,需要利用sum函数求出前3项的和为15。【题目要求】①等差数列中数字之间的差值不固定,需要自行输入。②输入要求的数列项数n。③输出前n项数据的和。输入描述两个正整数;第一个正整数为数列

水一下文章

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。文章使用到的的工具Python:一种编程语言,只能进行后端数据的处理和管理前端HTML文件,不能用来处理HTTP请求Nginx:web服务

Vue浏览器缓存sessionStorage+localStorage+Cookie

目录sessionStorage简介方法代码示例存取单个数据存取对象清除数据localStorage简介方法代码示例cookie简介方法代码示例区别sessionStorage与localStorage区别sessionStorage、localStorage、cookie区别sessionStorage简介-sess

前端如何实现隐藏滚动条,并且页面还可以滚动

在前端中,可以通过CSS和一些简单的样式调整来实现隐藏滚动条,同时保持页面可滚动。这通常涉及到在容器内部创建滚动区域,并隐藏默认的滚动条样式。下面是实现这一效果的基本步骤:创建一个滚动容器元素,使其包裹需要滚动的内容。通过CSS隐藏默认的滚动条样式,并设置容器的高度、宽度以及overflow属性来实现滚动效果。示例代码

数据治理-大数据与数据科学-定义大数据战略与业务需求

组织试图解决什么问题,需要分析什么虽然数据科学的优点是它可以为组织提供一个新的视角,但该组织仍然需要一个起点。一个组织可以决定如何使用这些数据来理解业务或业务环境,证明关于新产品价值的想法,探索未知的事物,或者发明一种新的商业方法。在项目实施的各个阶段,制订一个评估这些举措的计划非常重要,并且需要在多个时间点评估该计划

热文推荐