Shell脚本循环语句与函数

目录

一、循环语句

1、for循环语句

1.1、for—列表循环

案例一:输出一到五序列

案例二:打印6次“Goodbye”

案例三:打印abcde

案例四:输入0-50之间的偶数

1.2、for—不带列表循环

案例一:打印“Goodnight”

1.3、类C风格的for循环

案例一:打印1-6

案例二:打印1-20的奇数

案例三:计算1-100的奇数和

2、while循环语句

2.1、while死循环 

2.2、循环控制语句

案例一:输出1-10

案例二:输出1-20之间不能被4整除的数字

案例三:输出1-100的和

二、Shell函数

1、Shell函数的语法格式(两种)

2、函数返回值

3、函数的调用

4、函数的作用范围

5、函数的参数

5.1、计算位置变量$1和$2的和

5.2、调用函数删除文件

6、 return返回值

7、函数的递归


一、循环语句

1、for循环语句

for循环语句,是根据次数来控制循环,对每一个元素进行操作,一直到使用玩元素退出循环。

  • for循环语句的结构 

1.1、for—列表循环

  • 使用格式:
for 变量名 in {list}
do
    command
done

案例一:输出一到五序列
[root@localhost ceshi]# vim ceshi1.sh

#!/bin/bash
#需求:输出1-5
for i in {1..5}
do
  echo $i
done

  • 结果 

案例二:打印6次“Goodbye”
[root@localhost ceshi]# vim ceshi2.sh

#!/bin/bash
#需求:打印6次Goodbye
for i in {1..6}
do
  echo "Goodbye"
done

案例三:打印abcde
[root@localhost ceshi]# vim ceshi3.sh

#!/bin/bash
#需求:打印abcde
for i in a b c d e
do
  echo $i
done

案例四:输入0-50之间的偶数
[root@localhost ceshi]# vim ceshi4.sh

#!/bin/bash
#需求:输出0-50之间的偶数
for i in {0..50..2}
do
   echo $i
done

1.2、for—不带列表循环

  • 使用格式
for 变量名 
do
    command
done
  • 注意:需要在运行脚本时添加列表参数
案例一:打印“Goodnight”
  • 第一种
[root@localhost ceshi]# vim ceshi5.sh

#!/bin/bash
#需求:打印Goodnight
for i
do
   echo "Goodnigth"
done

  • 第二种
[root@localhost ceshi]# vim ceshi6.sh

#!/bin/bash
for i
do
  echo $i
done

1.3、类C风格的for循环

  • 语法格式
for ((expr1;expr2;expr3))
do
       command
done

expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出

注:

  •     i++ : i=1+1 先赋值再运算 i=1 之后 再 +1
  •     ++i : 1+1=i 先运算再赋值 1+1 之后 再=i 

运算符用法:

操作符 说明 示例 结果(假设变量 x 初始值为 10)
++ 自身变量 + 1 x++ x 变为 11
-- 自身变量 - 1 x-- x 变为 9
+=5 自身变量 + 5 x += 5 x 变为 15
-=5 自身变量 - 5 x -= 5 x 变为 5
*=5 自身变量 * 5 x *= 5 x 变为 50
/=5 自身变量 / 5 x /= 5 x 变为 2
%=5 自身变量 % 5 x %= 5 x 变为 0
案例一:打印1-6
[root@localhost ceshi]# vim ceshi7.sh

#!/bin/bash
for (( i=1; i<=6; i++))
do
   echo $i
done

案例二:打印1-20的奇数
[root@localhost ceshi]#  vim ceshi8.sh

#!/bin/bash
for (( i=1; i<=20; i+=2))
do
   echo $i
done

案例三:计算1-100的奇数和
[root@localhost ceshi]# vim ceshi9.sh

#!/bin/bash
sum=0
for (( i=1; i<=100; i++))
do
   let sum=$i+$sum
done
  echo "1-100的奇数和为:$sum"


2、while循环语句

while循环语句根据判断条件(表达式)来是否执行下一条的指令,如果为真,则执行,如果为假,则跳出循环。

  • 语法格式
while 表达式
do
    command
done
  • while循环语句的结构 

2.1、while死循环 

死循环一:

//写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
while [ 1 -eq 1 ]  
    command
done

死循环二:

while true
do
    command
done

死循环三:

while :
do
    command
done

2.2、循环控制语句

①、exit语句:

exit命令用于终止整个脚本的执行。可选的参数n是一个整数值,表示脚本的退出状态。通常,0表示成功,非零值表示出现了错误

②、break:

break命令用于跳出循环。当遇到break时,程序会立即跳出当前的循环结构,并执行循环后面的语句

③、continue:

continue命令用于结束当前循环的迭代,然后继续下一次迭代。当程序执行到continue时,会立即停止当前迭代并进入下一次循环迭代

总结

命令 功能描述 使用示例
exit 直接跳出程序,后面可跟状态返回码如 exit 1 等等 exit 0
break 立即终止当前循环,执行循环体外的代码 break
continue 跳过当前循环的剩余部分,开始下一次循环 continue

案例一:输出1-10

[root@localhost ceshi]# vim ceshi10.sh

#!/bin/bash
i=1
while [ $i -le 10 ]
do
  echo $i
  let i++
done
  echo "i最终值为:$i"

案例二:输出1-20之间不能被4整除的数字

[root@localhost ceshi]#

#!/bin/bash
i=1
while [ $i -le 20 ]
do
  if [[ $i%4 -ne 0 ]];then
    echo "$i"
  fi
    let i++
done

案例三:输出1-100的和

[root@localhost ceshi]# vim ceshi12.sh

#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
   let sum=$i+$sum
   let i++
done
   echo "1-100的和为:$sum"

二、Shell函数

1、Shell函数的语法格式(两种)


function 函数名 {
command
}       //这是一种规范写法


或者

函数名(){     //最常用因为最简洁
command
} 

  • 函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用
  • 定义的时候哪怕出现语法错误也没关系,不调用就不会报错
  • 当然我们写函数最终目的还是为了调用,为了实现某个功能块

2、函数返回值

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

函数使用原则:

  • 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
  • 退出状态码必须是0~255,超出时值将为取余256 

3、函数的调用

        直接在脚本里定义函数的代码块后写函数名即可完成调用


[root@localhost ceshi]# vim ceshi1.sh

#!/bin/bash
function zmx {
  echo "this is cxc"
}
zmx

[root@localhost ceshi]# sh ceshi1.sh 
this is cxc


①、注意:函数名必须是唯一,如果先定义了一个,再用同样的名称定义,第二个会覆盖第一个的功能,出现了你不想要的结果,所以这里一定要注意不要重名!

例如:

[root@localhost ceshi]# vim ceshi2.sh

#!/bin/bash
f6 (){
echo oppo
}

f6 (){
echo Good
}
f6

[root@localhost ceshi]# sh ceshi2.sh 
Good

②、注意:注意②:调用函数之前必须先进行定义!


[root@localhost ceshi]# vim ceshi3.sh

#!/bin/bash
f1 (){
echo hello
}


f3 (){
echo "$(f1) $(f2)"
}



f2 (){
echo world
}

f3

[root@localhost ceshi]# sh ceshi3.sh 
hello world


③、注意:注意③:不一定要在脚本开头就定义函数,只要调用之前定义就可以

如果是在其他地方嵌套调用等情况,不可以直接写函数的值,避免无法识别,可以用反撇号引起来,相当于是调用函数的结果

[root@localhost ceshi]# vim ceshi4.sh

#!/bin/bash
f1 (){
echo hello
}

f2 (){
echo world
}

f3 (){
echo "`f1` `f2`"   
}

f3

[root@localhost ceshi]# sh ceshi4.sh 
hello world


 

4、函数的作用范围

  • 在 Shell 脚本中函数的执行并不会开启一个新的子 Shell,而是仅在当前定义的 Shell 环境中有效。
  • 如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。
  • 在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。
  • 函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。
     

local命令:将变量限定在函数内部使用

[root@localhost ceshi]# vim ceshi5.sh

fun (){
local i
i=66
echo $i
}

i=99
fun
echo $i

[root@localhost ceshi]# sh ceshi5.sh 
66
99
  • fun 函数外部同样定义了变量i,内部变量i和全局变量i互不影响。脚本执行时先调用了函数fun,函数内部变量i为66,所以输出结果是66。调用完函数之后,给变量i赋值为99,再打印外部变量i,所以又输出 99。

5、函数的参数

语法格式

函数名称 参数1 参数2 参数3..........

5.1、计算位置变量$1和$2的和

[root@localhost ceshi]# vim ceshi6.sh

#!/bin/bash
add (){
let sum=$1+$2
echo $sum
}

add 4 5

[root@localhost ceshi]# sh ceshi6.sh 
9

5.2、调用函数删除文件

[root@localhost home]# vim ceshi1.sh

#!/bin/bash
fun (){
rm -rf $1
}
fun /home/ceshi.txt

6、 return返回值

函数的返回值就是函数当中运行最后一条命令的状态码,默认成功为0,失败为非0值,可以通过$?查看

  • return的值范围是0-255
  • 遇到return即结束函数不会再往下执行
[root@localhost home]# vim ceshi2.sh

#!/bin/bash
FILE=/home/kfc
test (){
if [ -f $FILE ];then
  return 100
else
  return 200
fi
}
test


7、函数的递归

函数自己调用自己的本身


案例:筛选目录

[root@localhost home]# vim ceshi3.sh

#!/bin/bash
list(){
for i in $1/*
do
        if [ -d $i ];then
        echo -e "\e[34m$i\e[0m"
        list $i " $2"
        else
        echo "$2$i"
fi
done
}
list $1 $2

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-23 10:36:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-23 10:36:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-07-23 10:36:03       82 阅读
  4. Python语言-面向对象

    2024-07-23 10:36:03       91 阅读

热门阅读

  1. Python语言-面向对象

    2024-07-23 10:36:03       91 阅读
  2. 开封建筑设计资质申请正确填写信息

    2024-07-23 10:36:03       46 阅读
  3. Android中接入hook框架:lancet-base

    2024-07-23 10:36:03       41 阅读
  4. 如何平衡硬约束与软约束

    2024-07-23 10:36:03       40 阅读
  5. 医学深度学习与机器学习融合的随想

    2024-07-23 10:36:03       45 阅读
  6. 19、基于共享内存的内存池

    2024-07-23 10:36:03       37 阅读
  7. Hisilicon适配按键

    2024-07-23 10:36:03       37 阅读
  8. qml实现双指左右滑动,上下滑动

    2024-07-23 10:36:03       38 阅读
  9. LeetCode 算法:分割回文串 c++

    2024-07-23 10:36:03       40 阅读