43.shell脚本循环与函数

shell脚本循环与函数

for 循环

for 循环用于一次性读取多个信息,逐一对信息进行操作处理,特别适合处理有范围的数据

语法
复制代码
for 变量名 in 取值列表
do
   命令序列
done
批量创建用户
复制代码
#!/bin/bash

touch /root/users.txt
echo aka blues cloe dio foks > /root/users.txt

read -p "给用户设置密码:" PASSWD
for i in `cat /root/users.txt`
do
        useradd $i
        echo "$PASSWD" | passwd --stdin $i
        echo "$i"用户创建成功
done
循环输出
复制代码
#!/bin/bash
echo "自增"
for ((i=1;i<=10;i++))
do
        echo $i
done

echo "自减"
for ((i=10;i>=1;i-=2))
do
        echo $i
done
计算数字1-100的整数和
复制代码
#!/bin/bash
a=0
for ((i=1;i<=100;i++))
do
        a=$(($i+$a))
done
echo "1-100所有整数和为 $a"

while 循环

while 循环重复测试某个条件,只要条件成立就反复执行

显示 0-10 的所有整数

复制代码
#!/bin/bash
a=0
while [ $a -le 10 ]
do
        echo $a
        let a++
done

计算 1-100 的整数和

复制代码
#!/bin/bash
a=0
b=1
while [ $b -le 100 ]
do
        a=$(($a+$b))
        let b++
done
echo "1-100的和: $a"

猜数字游戏

随机猜1000以内的数字

复制代码
#!/bin/bash
num=$(expr $RANDOM % 1000)
a=0
echo "猜数字的范围为0-999的整数"
while true
do
read -p "请输入你猜的数:" n
        let a++
if [ $n -gt $num ];then
        echo "猜的数字过大"
elif [ $n -lt $num ];then
        echo "猜的数字过小"
else
        echo "恭喜你猜对了"
        echo "你猜的次数为 $a"
        exit
fi
done

until 循环

until 循环重复测试某个条件,只要条件不成立就反复执行(与while相反)

求1-100的整数和

复制代码
#!/bin/bash
a=0
b=1
until [ $b -gt 100 ]
do
        a=$(($a+$b))
        let b++
done
echo "1-100的和: $a"

双for循环

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

复制代码
#!/bin/bash
for ((a=1;a<=3;a++))
do
        echo "a=$a"
        for((b=1;b<=5;b++))
        do
                echo "b=$b"
done
done

a每加1,b就循环一次

break 和 continue
  • break:跳出当前循环

  • continue:中止某次循环,不会完全终止整个命令

    #!/bin/bash
    for ((a=1;a<=3;a++))
    do
    echo "a=a" for((b=1;b<=5;b++)) do if [ b -eq 3 ];then
    break #当b=3时,就停止运行
    fi
    echo "b=$b"
    done
    done

复制代码
#!/bin/bash
for ((a=1;a<=10;a++))
do
if [ $a -gt 4 ]&&[ $a -lt 8 ];then
        continue	#当a大于4小于8时,停止循环
fi
        echo "$a"
done

用shell脚本写一个九九乘法表
复制代码
#!/bin/bash
for ((i=1; i<=9; i++))
do
  for ((o=1; o<=i; o++))
   do
        let c=$i*$o
        echo -n "$i*$o=$c "
   done
        echo ""
done

[root@xieyuhui ~]# bash a.sh 
1*1=1 
2*1=2 2*2=4 
3*1=3 3*2=6 3*3=9 
4*1=4 4*2=8 4*3=12 4*4=16 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

函数

函数将命令序列按格式写在一起,可重复使用。

函数定义格式
复制代码
# 方式一
function 函数名 {
   命令序列
}

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

使用 return 退出函数并返回一个退出值(0-255),通过 $? 显示

复制代码
#!/bin/bash
function x {
        read -p "请输入任意一个整数:" n
        return $[$n*2]
}
x
echo "$?"
函数传参

函数变量的作用范围(局部变量以及全局变量)

函数在shell脚本中仅在当前shell环境中有效

shell脚本中变量默认全局有效

将变量限定一个函数的内部local,即局部变量

复制代码
#!/bin/bash

num1 (){
        num=$[ $1+$2 ]
        echo $num
}
num1 $1 $2

局部变量与全局变量

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

即这个local的变量仅仅在当前的函数内有效,在别的函数中无效。

复制代码
#!/bin/bash

abc (){
        echo "为经过local的变量$i"	#此时局内变量未定义,因此是全局变量i=9
        local i
        i=6
        echo "函数内的变量$i"	  #此时局内变量已定义,因此为i=6
}
i=9
abc
echo "外面变量$i"		#局内定义的变量只能在定义的函数中使用,因此此处为全局变量

递归函数

递归函数调用自身

复制代码
#!/bin/bash

function a(){
        if [ $1 -eq 1 ];then
                echo 1
        else
                local temp=$[$1-1]
                local result=`a $temp`
                echo $[result * $1 ]
        fi
}

read -p "输入一个值:" va
result=`a $va`
echo "阶乘的值为: $result"

函数库

将常用函数集中放在一个脚本中,在需要使用时直接调用即可

先写一个函数库

复制代码
[root@xieyuhui ~]# vim hsk.sh

#!/bin/bash
jia(){
        result=$[ $1 + $2 ]
        echo "$result"
}

jian(){
        result=$[ $1 - $2 ]
        echo "$result"
}

cheng(){
        result=$[ $1 * $2 ]
        echo "$result"
}

chu(){
        if [ $2 -ne 0 ];then
        result=$[ $1 / $2 ]
        echo "$result"
        else
        echo "除法中分母不能为0"
        fi
}

[root@xieyuhui ~]# chmod +x hsk.sh

[root@xieyuhui ~]# vim aa1.sh

#!/bin/bash
. /root/hsk.sh

read -p "请输入第一个数字:" n
read -p "请输入第二个数字:" m

result1=`jia $n $m`
result2=`jian $n $m`
result3=`cheng $n $m`
result4=`chu $n $m`

echo "两数之和为: $result1"
echo "两数之差为: $result2"
echo "两数之积为: $result3"
echo "两数之商为: $result4"
相关推荐
用户9718356334663 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪5 小时前
linux 拷贝文件或目录到指定的位置
linux
大树8821 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠21 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质21 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush421 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52021 小时前
Linux 11 动态监控指令top
linux
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩1 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言