七、循环语句
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的。
对象不一样,其他命令相同。例如,根据通讯录中的命令列表创建系统账号,根据服务器清单检查各主机的存活状态,当面对各种列表重复任务时,使用简单的if语句已经难以满足需求,而顺序编写全部代码更是显得异常繁琐、困难重重。
for循环
语法结构:
1、列表循环
2、不带列表循环
3、类c风格的for循环
列表循环
for 变量名 in {list}
do
command
done
================================================================================
for i in {1..5} //{}里面不识别变量
do
echo $i
done
================================================================================
for i in `seq 5` //seq 5=1、2、3、4、5序列
do
echo $i
done
================================================================================
for 变量名 in a b c
do
command
done
================================================================================
for i in a b c //i这里实际没有调用,所有就相当于in后面几个参数就循环几次
do
echo 123
done
================================================================================
for i in a b c // 这里调用到i变量了,所有就正常显示i的值(a/b/c)
do
echo $i
done
第一次循环:将a这个值赋予给“i”这个变量,并且输出123
第二次循环:将b这个值赋予给“i”这个变量,并且第二次输出123
第三次循环:将c这个值赋予给“i”这个变量,并且第三次输出123
例:打印1-5这5个数字
[root@localhost ~]# vim for1.sh
[root@localhost ~]# chmod +x for1.sh
[root@localhost ~]# ./for1.sh
1
2
3
4
5
[root@localhost ~]# cat for1.sh
#!/bin/bash
for i in {1..5}
do
echo $i
done
例:打印5次helloword
[root@localhost ~]# vim for2.sh
[root@localhost ~]# chmod +x for2.sh
[root@localhost ~]# ./for2.sh
hello world
hello world
hello world
hello world
hello world
[root@localhost ~]# cat for2.sh
#!/bin/bash
for i in {1..5}
do
echo hello world
done
[root@localhost ~]#
例:输入0-50之间的偶数
[root@localhost ~]# cat for3.sh
#!/bin/bash
for i in {0..50..2}
do
echo $i
done
[root@localhost ~]#
附:大括号{}和seq在for循环
for i in {1..50..2} 1-50的奇数
for i in {2..50..2} 1-50的偶数
for i in {10..1} 1-10倒序排列
for i in $(seq 10) 1-10正序排列
for i in $(seq 10 -1 1) 1-10倒序排列
for i in $(seq 1 2 10) 1-10的奇数,中间为步长
for i in $(seq 0 2 10) 1-10的偶数,中间为步长
小结:for循环中for i in {list} 使用方式
i为自定义变量名
in 首先将in 之后的内容,定义为一个list 然后循环列表中的元素进行取值,并每次取值后赋予给变量i(变量名)
{list}列表:①定义循环次数
? ②每个元素,在每次循环时都会被依次取出,然后复制给变量名
以do为分割
然后command :定义每次循环时,要输出的指令
done 结束
不带列表循环执行时由用户指定参数和参数的个数决定的
for 变量名
do
command
done
例:打印hello
[root@localhost ~]# vim for2.sh
#!/bin/bash
for i
do
echo hello
done
[root@localhost ~]# . for2.sh //没有给脚本传参所以执行了没有结果
[root@localhost ~]# . for2.sh a //把a赋值给变量i,i有值了它就开始执行do..done 了
hello
####################################################################################
for i
do
echo $i
done
[root@localhost ~]# bash for2.sh hello
hello
类c风格的for循环
for ((exper1;exper2;exper3))
do
command
done
expr1:定义变量并赋初值
expr2:定义是否循环,定义可取值的范围(目的是定义循环的次数) i<=10
expr3:决定循环变量如何改变,决定循环什么时候退出 自定义步长
例:打印1-5
[root@localhost ~]# vim for4.sh
[root@localhost ~]# chmod +x for4.sh
[root@localhost ~]# sh for4.sh
1
2
3
4
5
[root@localhost ~]# cat for4.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
echo $i
done
[root@localhost ~]#
注:i++ : i=1+l 先赋值再运算 i=1之后再+1
++i : l+1=i 先运算再赋值 l+1之后再=i
类c风格运算符用法
++ 自生变量+1
– 自身变量-1
+=5 自身变量+5
-=5 自身变量-5
*=5 自身变量 *5
/=5 自身变量/ 5
%=5 自身变量%5
例:计算1-100的奇数和
[root@localhost ~]# vim for5.sh
[root@localhost ~]# chmod +x for
for1.sh for2.sh for3.sh for4.sh for5.sh
[root@localhost ~]# chmod +x for5.sh
[root@localhost ~]# sh for5.sh
1-100的奇数和为:2500
[root@localhost ~]# cat for5.sh
#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
do
let sum=$i+$sum
done
echo "1-100的奇数和为:$sum"
[root@localhost ~]#
例:删除数字文件
[root@localhost opt]# cat del.sh
#!/bin/bash
a=$(find ./ -name "[1-9]" -type f )
for b in $a
do
rm -f $b
done
[root@localhost opt]#
例:脚本批量添加用户
#!/bin/bash
ULIST=$(cat /root/users.txt) #user.txt记录所要创建用户名
for UNAME in $ULIST
do
useradd $UNAME #添加用户
echo "123456" | passwd --stdin $UNAME &>/dev/null
done
例:批量删除用户的脚本
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
userdel -r $UNAME &>/dev/null
done
例:根据ip地址查看主机状态
-c:发送包的数量
-i:发送ping包间隔
-w:超时时间
根据文本查看:
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] then
echo "Host $IP is up."
else
echo "Host $IP is down."
fi
done
根据段查看:
#!/bin/bash
network="192.168.10" #自定义网段
for addr in {1..254}
do
ping -c 2 -i 0.5 -W 3 $network.$addr &> /dev/null
if [ $? -eq 0 ];then
echo "$network.$addr is up"
else
echo "$network.$addr is down"
fi
done
例:用户输入密码,脚本判断密码是否正确,输入正确提示正确信息,连续输错3次则报警
[root@localhost ~]# sh for8.sh
请输入密码:123123
密码正确!
[root@localhost ~]# sh for8.sh
请输入密码:3
请输入密码:4
请输入密码:5
请稍后再试!
================================================================================
[root@localhost ~]# cat for8.sh
#!/bin/bash
mima=123123
for ((i=1;i<=3;i++))
do
read -p "请输入密码:" PD
if [ $PD == $mima ];then
echo "密码正确!"
exit #退出进程
fi
done
echo "请稍后再试!"
while 语句的结构
while循环 ①语法结构 ②死循环(语法结构)
while循环一般用于有条件判断的循环,若条件为真,则进入循环,若条件为假就跳出循环
语法结构:
while 表达式
do
command
done
例:打印1-5
[root@localhost ~]# cat for9.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i++
done
[root@localhost ~]# sh for9.sh
1
2
3
4
5
[root@localhost ~]#
例:输出1-100之间不能被3整除的数字
[root@localhost ~]# cat for10.sh
#!/bin/bash
i=0
while [ $i -le 100 ]
do
if [[ $i%3 -ne 0 ]];then
echo $i
fi
let i++
done
例:打印1-100的和
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
let sum=$i+$sum
let i++
done
echo $sum
例:安装并开启某服务(httpd)
[root@localhost ~]# cat for11.sh
#!/bin/bash
i=$1
case $i in
httpd)
yum install -y httpd
if [ $? -eq 0 ];then
echo "安装完成,正在开启"
systemctl start httpd
if [ $? -eq 0 ];then
echo "开启成功"
else
echo "开启失败"
fi
else
echo "安装失败"
fi
;;
esac
[root@localhost ~]#
例:监控某服务(httpd)运行状态
#!/bin/bash
#定义一个while循环,条件表达式:就是过滤、查看httpd的进程
while ps aux | grep httpd | grep -v grep &> /dev/null
do
#如果查询的结果为能过滤到进程,则输出正在运行
echo "httpd 正在运行中"
#sleep 作用1:保持不要太频繁,节省一定的资源 作用2:避免卡死状态
sleep 2
#done (循环退出/退出)的触发条件是while的判断为假(意味着httpd进程退出,可以判断为服务未运行)
done
#循环结束后,echo :httpd不在允许
echo "httpd 不在运行"
while 死循环
while [ 1 -eq 1] #写一个永远为真的表达式,1等于1这个条件为真,所以这个脚本会一直循环下去
do
command
done
##############################################################################
while true
do
command
done
##############################################################################
while :
do
command
done
例:猜数字,猜不对就一直猜
num=10
while true
do
read -p "请输入数字:" shu
if [ $shu -eq $num ];then
echo "你猜对了"
break
elif [ $shu -gt $num ];then
echo "你猜大了"
elif [ $shu -lt $num ];then
echo "你猜小了"
fi
done
例:批量添加规律编号的用户
#!/bin/bash
USERS="stu"
i=1
while [ $i -le 20 ]
do
useradd ${USERS}$i
echo "123456" | passwd --stdin ${USERS}$i &> /dev/null
let i++
done
例:猜商品价格游戏
$random 用于生成0-32767的随机数
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
a=0
echo "商品实际价格范围为 0-999,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格数目:" n
let a++
if [ $n -eq $PRICE ] ; then
echo "恭喜你答对了,实际价格是 $PRICE"
echo "你总共猜测了 $a 次"
exit 0
elif [ $n -gt $PRICE ] ; then
echo "你猜高了!"
else
echo "你猜低了!"
fi
done
#!/bin/bash
sorce=$[$RANDOM % 1000]
a=1
num=0
while[ $a -lt 2 ]
do
read -p "请输入你猜的价格(1-999之 间) :" price
if [ $price -eq $sorce ] ; then
echo "恭喜你猜对了!"
let num++
let a++
elif [ $price -gt $sorce ] ; then
echo "你猜高了!"
let num++
elif[ $price -lt $sorce ] ; then
echo "你猜小了!"
let num++
fi
done
echo "你一共猜了$num次!"
需求1:首先要求有4家店,每家店 3个商品(3个商品的价格统一为100 200 300),然后要求以交互式的方式,让用户选择进入哪家店,并且选择哪个商品 需求2:用户可以循环进入门店,除非用户选择“退出” 需求3,最后统计用户今天逛了几次店,一共买了多少商品(设定,用户在每家店至少会购买1件),至少逛4次
[root@localhost ~]# vim shangdian.sh
[root@localhost ~]# chmod +x shangdian.sh
[root@localhost ~]# sh shangdian.sh
进入第1家店
是否进入[yes/no]yes
1:衣服¥200
2:鞋子¥150
3:手套¥40
4:裤子¥155
请选择你要购买的商品:2
鞋子150块!
是否继续?yes
1:衣服¥200
2:鞋子¥150
3:手套¥40
4:裤子¥155
请选择你要购买的商品:3
手套40块!
是否继续?no
进入第2家店
是否进入[yes/no]no
进入第3家店
是否进入[yes/no]no
进入第4家店
是否进入[yes/no]no
购物总价:190
================================================================================
[root@localhost ~]# cat shangdian.sh
#!/bin/bash
i=1
sum=0
while [ $i -lt 5 ]
do
echo "进入第$i家店"
read -p "是否进入[yes/no]" xuanze
while [ $xuanze == yes ]
do
echo "1:衣服¥200"
echo "2:鞋子¥150"
echo "3:手套¥40"
echo "4:裤子¥155"
read -p "请选择你要购买的商品:" x
case $x in
1)
echo "衣服200块!"
expr $[sum+=200] &> /dev/null
;;
2)
echo "鞋子150块!"
expr $[sum+=150] &> /dev/null
;;
3)
echo "手套40块!"
expr $[sum+=40] &> /dev/null
;;
4)
echo "裤子155块!"
expr $[sum+=155] &> /dev/null
;;
esac
read -p "是否继续?" xuanze
done
let i++
if [ $xuanze == no ];then
continue
fi
done
echo "购物总价:$sum"
[root@localhost ~]#
例 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M 时,发送报警邮件给 root 管理员
#!/bin/bash
#提取根分区剩余空间
disk_size=$(df / |awk '/\//{print $4}')
#提取内存剩余空间
mem_size=$(free |awk '/Mem/{print $4}')
while :
do
#注意内存和磁盘提取的空间大小都是以Kb 为单位
if [ $disk_size ‐le 512000 -a $mem_size ‐le 1024000 ];then
mail ‐s Warning root <<EOF
Insufficient resources,资源不足
EOF
fi
done
until循环
跟while相反,条件为假进入循环,条件为真退出循环
语法结构
until 表达式
do
command
done
例:计算1-50的和1275两种写法第一种
#!/bin/bash
i=0;s=0
until [ $i -eq 51 ]
do
let s+=i #s+=i,等价于s=s+i,使用加赋值
let i++
done
echo $s
第二种
vim 50.sh
#!/bin/bash
i=1
sum=0
until [ $i -eq 51 ] //这里注意如果是50的话条件为真循环结束它计算的是1-49的和,until [ $i -gt 50 ]也行
do
sum=$[$i+$sum]
let i++
done
echo "$sum"
死循环结构:
until false
do
command
done
until [ 1 -ne 1 ]
do
command
done
例、登录zhangsan用户 使用root 发消息个zhangsan
#!/bin/bash
username=$1
#判断信息格式
if [ $# -lt 1 ];then
echo "Usage:`basename $0` <username> [<message>]"
exit 1
fi
#判断用户是否存在
if grep "^$username:" /etc/passwd >/dev/null ;then :
else
echo "用户不存在"
exit 1
fi
#用户是否在线,如果不在线每5秒联系一次
until who|grep "$username" >/dev/null
do
echo "用户不存在"
sleep 5
done
mes=$*
echo $mes | write $username
注:测试时切换下用户
循环控制语句
for循环一般会搭配条件判断语句和流程控制语句一起执行,那么就会出现需要跳过循环和终止循环的情况,控制循环的命令可以有以下3个。
1、continue
继续,但不会执行循环体内下面的代码了,开始重新开始下一次循环
例:打印1-5的数字,3不打印
[root@localhost ~]# vim for13.sh
[root@localhost ~]# sh for13.sh
1
2
4
5
[root@localhost ~]# cat for13.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
if [ $i -eq 3 ];then
continue
else
echo $i
fi
done
结果是1245,3不输出,因为跳出后面的echo语句执行下一次循环了
2、break
打断,马上停止本次循环,执行循环体外的代码
例:1-10的数字,7后面的都不打印
[root@localhost ~]# vim for14.sh
[root@localhost ~]# sh for14.sh
1
2
3
4
5
6
7
[root@localhost ~]# cat for14.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
if [ $i -eq 8 ];then
break
else
echo $i
fi
done
[root@localhost ~]#
3、exit
直接跳出程序,后面可跟状态返回码如exit 1 等等
[root@localhost ~]# vim for15.sh
[root@localhost ~]# sh for15.sh
1
2
[root@localhost ~]# cat for15.sh
#!/bin/bash
for i in {1..5}
do
if [ $i -eq 3 ];then
exit 100
else
echo $i
fi
done
echo hi
[root@localhost ~]#
直接跳出程序所以不会执行组后的echo hi,并且返回码是100通过$?查看
shell函数
函数的定义
第一种:
function 函数名{
command
} #这是一种规范写法
第二种:
函数名 (){ #最常用因为最简洁
command
}
函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用。定义的时候哪怕出现语法错误也没关系,不调用就不会报错。当然我们写函数最终目的还是为了调用,为了实现某个功能块。
函数返回值:
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为取余256 (例444%256)
函数的调用
直接在脚本里定义函数的代码块后写函数名即可完成调用
[root@localhost ~]# vim hanshu.sh
[root@localhost ~]# chmod +x hanshu.sh
[root@localhost ~]# ./hanshu.sh
this is a function
[root@localhost ~]# cat hanshu.sh
#!/bin/bash
function fun1 { #定义了一个函数叫做fun1
echo "this is a function" #函数体的功能就是打印“this is a function”
}
fun1 #直接写函数名就会运行函数体内的代码
①函数名必须是唯一,如果先定义了一个,再用同样的名称定义,第二个会覆盖第一个的功能,注意不要重名!
[root@localhost ~]# vim hanshu1.sh
[root@localhost ~]# chmod +x hanshu1.sh
[root@localhost ~]# ./hanshu1.sh
world
[root@localhost ~]# cat hanshu1.sh
#!/bin/bash
f1 (){
echo hello
}
f1 (){
echo world
}
f1
②调用函数之前必须先进行定义!
[root@localhost ~]# vim hanshu1.sh
[root@localhost ~]# ./hanshu1.sh
hello world
[root@localhost ~]# cat hanshu1.sh
#!/bin/bash
f1 (){
echo hello
}
f3 (){
echo "$(f1) $(f2)" #这里虽然提前调用了f2,但是f2的函数还是在运行f3之前定义的所以他能够找到
}
f2 (){
echo world
}
f3
[root@localhost ~]#
③:不一定要在脚本开头就定义函数,只要调用之前定义就可以
如果在其他地方嵌套调用等情况,不可以直接写函数的值,避免无法识别,可以用反撇号引起来,相当于是调用函数的结果。
[root@localhost ~]# vim hanshu1.sh
[root@localhost ~]# sh hanshu1.sh
helloworld
[root@localhost ~]# cat hanshu1.sh
#!/bin/bash
f1 (){
echo hello
}
f2 (){
echo world
}
f3 (){
echo "`f1``f2`" #如果直接是f1和f2的话,打印出来不会是helloworld而是f1f2
}
f3
[root@localhost ~]#
return
[root@localhost ~]# vim return.sh
[root@localhost ~]# sh return.sh
请输入一个数字:4
8
[root@localhost ~]# cat return.sh
#!/bin/bash
function test1 {
read -p "请输入一个数字:" num
return $[$num*2]
}
test1
echo $?
[root@localhost ~]# vim return2.sh
[root@localhost ~]# sh return2.sh
请输入值2:4
16
[root@localhost ~]# cat return2.sh
#!/bin/bash
test2 (){
read -p "请输入值2:" num
echo $[$num*2]
}
res=$(test2)
echo $[$res*2]
[root@localhost ~]#
函数传参
例:两个数求和
[root@localhost ~]# vim chuancan.sh
[root@localhost ~]# sh chuancan.sh
请输入第一个数:3
请输入第二个数:4
你输入的两个数为: 3 和 4
两个数的和为:7
[root@localhost ~]# cat chuancan.sh
#!/bin/bash
sum (){
read -p "请输入第一个数:" num1
read -p "请输入第二个数:" num2
echo "你输入的两个数为:" $num1 和 $num2
sum=$(($num1+$num2))
echo "两个数的和为:$sum"
}
sum
[root@localhost ~]#
函数的作用范围
在 Shell 脚本中函数的执行并不会开启一个新的子 Shell,而是仅在当前定义的 Shell 环境中有效。如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。
shell脚本中变量默认全局有效 local命令:将变量限定在函数内部使用
[root@localhost ~]# vim myfun.sh
[root@localhost ~]# sh myfun.sh
8
9
[root@localhost ~]# cat myfun.sh
#!/bin/bash
myfun (){
local i
i=8
echo $i
}
i=9
myfun
echo $i
上述脚本中myfun 函数内部使用了local命令设置变量i,其作用是将变量i限定在函数内部。myfun 函数外部同样定义了变量i,内部变量i和全局变量i互不影响。脚本执行时先调用了函数myfun,函数内部变量i为8,所以输出结果是8。调用完函数之后,给变量i赋值为9,再打印外部变量i,所以又输出 9
计算位置变量$1和$2的和
[root@localhost ~]# vim sum.sh
[root@localhost ~]# sh sum.sh
9
[root@localhost ~]# cat sum.sh
#!/bin/bash
add (){
let sum=$1+$2 #这里的位置变量是函数的位置变量。所以要写在调用函数的后面,如果是调用脚本时使用则不能成功
echo $sum
}
add 4 5
[root@localhost ~]#
[root@localhost ~]# vim sum.sh
[root@localhost ~]# chmod +x sum.sh
[root@localhost ~]# ./sum.sh 3 4
7
[root@localhost ~]# cat sum.sh
#!/bin/bash
add (){
let sum=$1+$2
echo $sum
}
add $1 $2 #相当于调用脚本的参数,把脚本的位置变量传递给函数进行计算
[root@localhost ~]#
例:阶乘
根据用户需求算几的阶乘
方式一:给用户提示输入
方式二:用位置变量的方式
函数的返回值,用return来自定义返回码
函数的返回值就是函数当中运行最后一条命令的状态码,默认成功为0,失败为非0值,可以通过$?查看,但是可以自己自定义返回码,用reyurn。
1、return的值范围是0-255
2、遇到return即结束函数不会再往下执行
例:测试文件是否存在
例:两个数之和
本地变量与全局变量
在脚本里定义的变量或者在函数体没有声明为本地变量的都为全局变量,意思是在当前shell环境都识别。如果需要这个变量只在函数中使用则可以在函数中用local关键字声明,这样即使函数体外有个重名的变量也没关系,不影响在函数体的使用 如果是用source执行脚本的话就能看出差别
将之前写过的算数字总和和算奇数和偶数和的脚本融合在一个脚本中并用函数根据用户的输入来调用它们
[root@jx ~]# sh diaoyong.sh SUM
计算输入数字总和:76
2926
[root@jx ~]# sh diaoyong.sh SUM
计算输入数字总和:10
55
[root@jx ~]# sh diaoyong.sh oushu
计算输入数字偶数的总和:10
30
[root@jx ~]# sh diaoyong.sh jishu
计算输入数字奇数的总和:10
25
[root@jx ~]# cat diaoyong.sh
#!/bin/bash
#数字总和
SUM(){
sum=0
read -p "计算输入数字总和:" num
for ((i=1;i<=$num;i++))
do
let sum=$i+$sum
done
echo $sum
}
#偶数和
oushu(){
sum=0
read -p "计算输入数字偶数的总和:" num
fovir ((i=0;i<=$num;i+=2))
do
let sum=$i+$sum
done
echo $sum
}
#奇数和
jishu(){
sum=0
read -p "计算输入数字奇数的总和:" num
for ((i=1;i<=$num;i+=2))
do
let sum=$i+$sum
done
echo $sum
}
if [ $1 == SUM ];then
SUM
elif [ $1 == oushu ];then
oushu
elif [ $1 == jishu ];then
jishu
else
echo "参数错误!"
fi
[root@jx ~]#
函数的递归
函数自己调用自己的本身
列出目录内文件列表,目录用蓝色表示,文件显示层级关系
[root@jx ~]# cat list.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
图片转存中…(img-d1o5PKUQ-1656739864199)]
将之前写过的算数字总和和算奇数和偶数和的脚本融合在一个脚本中并用函数根据用户的输入来调用它们
[root@jx ~]# sh diaoyong.sh SUM
计算输入数字总和:76
2926
[root@jx ~]# sh diaoyong.sh SUM
计算输入数字总和:10
55
[root@jx ~]# sh diaoyong.sh oushu
计算输入数字偶数的总和:10
30
[root@jx ~]# sh diaoyong.sh jishu
计算输入数字奇数的总和:10
25
[root@jx ~]# cat diaoyong.sh
#!/bin/bash
#数字总和
SUM(){
sum=0
read -p "计算输入数字总和:" num
for ((i=1;i<=$num;i++))
do
let sum=$i+$sum
done
echo $sum
}
#偶数和
oushu(){
sum=0
read -p "计算输入数字偶数的总和:" num
fovir ((i=0;i<=$num;i+=2))
do
let sum=$i+$sum
done
echo $sum
}
#奇数和
jishu(){
sum=0
read -p "计算输入数字奇数的总和:" num
for ((i=1;i<=$num;i+=2))
do
let sum=$i+$sum
done
echo $sum
}
if [ $1 == SUM ];then
SUM
elif [ $1 == oushu ];then
oushu
elif [ $1 == jishu ];then
jishu
else
echo "参数错误!"
fi
[root@jx ~]#
函数的递归
函数自己调用自己的本身
列出目录内文件列表,目录用蓝色表示,文件显示层级关系
[外链图片转存中…(img-MVv4vJCF-1656739864200)]
[root@jx ~]# cat list.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
|