Shell编程之循环语句与函数的使用

目录

一、循环结构

1、for循环

格式

循环的使用方法 

双重循环 循环嵌套

break

2、while循环

格式

        untli循环语句

案例

二、Shell函数

Shell函数的定义

 函数返回值

Shell的函数传参

函数变量的作用范围

 函数的递归

阶乘

 具体操作流程:

 定义函数创建库


一、循环结构

1、for循环

格式

for 变量名 in 取值列表
do
	命令序列
done

循环的使用方法 

 

 也可以通过seq来循环列出数据

将for循环写入脚本;

计算1-10的和

 如上的for循环脚本只显示了运行的结果,若是想要显示出循环的过程可以加入一句set -x的命令

 

 

双重循环 循环嵌套

即在一个for循环内部再加上一个for循环

for ((变量=X; 指定变量范围; 指定变量迭代的方式))#定义外循环
do
  for ((变量=X; 指定变量范围; 指定变量迭代的方式))#定义内循环
  do
  命令序列
  指定变量迭代的方式
  done
  命令序列
done

例:

#!/bin/bash
for ((a=1; a<=5; a++))
do
  echo "外部循环 $a"
  for ((b=1; b<=5; b++))
  do
    echo "    内部命令 $b"
  done
done

exit 用于退出脚本进程

break [n] 用于跳出单(n代表多少层)层循环

continue 用于中止某次循环中的操作,但是不会完全终止整个循环命令

break

使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。

  • 跳出当前循环
  • 并且break下面的语句不去执行

2、while循环

while就是重复测试某个条件,只药条件成立则反复执行

格式

while 条件测试操作
do 
	命令序列
done

 猜商品价格游戏,通过变量RANDOM获得随机数,提示用户猜测并记录次数,猜中后退出循环

 

untli循环语句

  • 重复测试某个条件,只要条件不成立则反复执行
untli 条件测试
do
  命令序列
  条件里的变量能够迭代
done

案例

计算1~50之间的和值

二、Shell函数

  • 将命令序列按格式写在一起
  • 可方便重复使用命令序列

Shell函数的定义

方法一
function 函数名 {
	命令序列
	return x	#也可使用exit来显示函数的结束运行
}

  方法二

方法二
函数名 (){
	命令序列
}

 函数返回值

return表示退出函数并返回一个退出值,脚本中可以用echo $?变量显示该值,return 1 退出函数并返回,返回值为1

使用原则:

  • 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
  • 退出状态码必须是0~255, 超出时值将为除以256取余
#!/bin/bash
function test {
  read -p "请输入一个数值:" num
  return $[$num * 2]
}
######## main ########
test
echo $?
[root@localhost data]# bash demo1.sh 
请输入一个数值:100
200

#最大不能超过255的范围,如果需要则必须调用echo,所以:
test () {
  read -p "请输入一个数值:" num
  echo $[$num * 2]
}
######## main ########
result=$(test)
echo $result
[root@localhost data]# bash demo1.sh 
请输入一个数值:300
600

1.形式

形参:定义一个函数void add(int a, int b),这里的a和b就是形参。

实参:当你进行函数调用的时候,add(1, 2),这里的1和2就是实参

2.使用

形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。

实参出现在主调函数中,进入被调函数后,实参变量也不能使用。

Shell的函数传参

sum1 () {
  sum=$[$1 + $2]
  echo $sum
}
######## main ########
read -p "输入第一个参数: " first
read -p "输入第二个参数: " second
result=$(sum1 $first $second)
echo $result
[root@localhost data]# bash demo2.sh 
输入第一个参数: 10
输入第二个参数: 20
30

//如果用此方法写函数体外的$1$2与函数体内的$1$2是有区别的
#!/bin/bash
sum1 () {
  sum=$[$1 + $2]  #而此时的$1与$2对应的是函数体内的$1与$4
  echo $sum
}
######## main ########
result=$(sum1 $1 $4 $2] 
//此时$1会把10当作函数体内的第一个变量,接着对应着函数体外的$2为函数体内的$4,对应下面数字的10与40
echo $result
[root@localhost data]# bash demo2.sh 10 20 30 40 
50

函数变量的作用范围

  • 函数在Shell脚本中仅在当前Shell环境中有效(source会影响当前shell的环境)
  • Shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令(设置为局部变量)

 在函数体内设置局部变量

local 变量名=…

#!/bin/bash
myfun() {

echo $i
local i=9   #local命令设置为局部变量仅仅是在函数体内的有效,出了函数就无效了
echo $i
}

i=8
myfun
echo $i
[root@yzy data]# bash demo3.sh 
8
9
8

 函数的递归

  • 函数体内调用自己本身的函数

阶乘

#!/bin/bash
fact() {
  if [ $1 -eq 1 ]
  then
    echo 1
   else
     local temp=$[$1 - 1]
     local result=$(fact $temp)
     echo $[$1 * $result]
   fi
}
######## main ########
read -p "请输入一个要阶乘的数值:" n
result=$(fact $n)
echo "$n的阶乘结果为:$result"
[root@yzy data]# bash demo4.sh
请输入一个要阶乘的数值:5
5的阶乘结果为:120

 具体操作流程:

n=5fact 5
fact()$1=5temp=5-1=4result=$(fact 4)echo 5 * $(fact 4)
$1=4temp=4-1=3result=$(fact 3)echo 5 * 4 * $(fact 3)
$1=3temp=3-1=2result=$(fact 2)echo 5 * 4 * 3 * $(fact 2)
$1=2temp=2-1=1result=$(fact 1)echo 5 * 4 *3 * 2 * $(fact 1)
$1=1$(fact 1)=1echo 5 *4 *3 *2 *1

 定义函数创建库

vim myfuncs.sh
#加法
jiafa() {
  echo $[$1 + $2]
}
#减法
jianfa() {
  echo $[$1 - $2]
}
#乘法
chengfa() {
  echo $[$1 * $2]
}
#除法
chufa() {
  if [ $2 -ne 0 ];then
    echo $[$1 / $2]
  else
    echo "0 不能作为除数"
  fi
}
#阶乘
fact() {
  if [ $1 -eq 1 ];then
    echo 1
  elif [ $1 -eq 0 ];then
    echo 0
  else
    local temp=$(jianfa $1 1) 
    local result=$(fact $temp)
    #echo $[$1 * $result]或:
    echo $[chengfa $1 $result]
  fi
}
//使用如下:
vim test.sh
. myfuncs.sh或source myfuncs.sh

v1=$1
v2=$2
result1=$(jiafa $v1 $v2)
result2=$(jianfa $v1 $v2)
result3=$(chengfa $v1 $v2)
result4=$(chufa $v1 $v2)
result5=$(fact $v1 $v2)

echo "加法结果为: $result1"
echo "减法结果为: $result2"
echo "乘法结果为: $result3"
echo "除法结果为: $result4"
echo "阶乘结果为: $result5"

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值