Shell脚本循环、函数

一、循环语句

1、for循环详解

        for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理。当要处理的数据有范围时,使用for循环语句就再适合不过了。

读取不同的变量值,用来逐个执行同一组命令。

语法:

for  变量名  in  取值列表

do

   命令序列(命令行)

done

示例一:

        下面使用for循环语句从列表文件中读取多个用户,然后为其逐一创建用户账户并设置密码。首先创建用户名称的列表文件users.txt,每个用户名称单独一行。

# 首先创建用户名称的列表文件users.txt,每个用户名称单独一行。
[root@node1 ~]# vim /root/users.txt
jim
bob
marry
rose
mike

# 接下来编写shell标本addusers.sh。在脚本中使用read命令读取用户输入的密码值,然后赋值给PASSWD
变量,并通过-p参数向用户显示一段提示信息,告诉用户正在输入的内容即将作为账户密码
 
[root@node1 ~]# vim /root/addusers.sh
#!/bin/bash
read -p "enter the user password:" PASSWD
for UNAME in `cat /root/users.txt`
do
        useradd $UNAME
        echo "$PASSWD" | passwd --stdin $UNAME
        echo "$UNAME",create success
done

# 执行
[root@node1 ~]# chmod +x addusers.sh 
[root@node1 ~]# ./addusers.sh 
enter the user password:linux
Changing password for user jim.
passwd: all authentication tokens updated successfully.
jim,create success
Changing password for user bob.
passwd: all authentication tokens updated successfully.
bob,create success
Changing password for user marry.
passwd: all authentication tokens updated successfully.
marry,create success
Changing password for user rose.
passwd: all authentication tokens updated successfully.
rose,create success
Changing password for user mike.
passwd: all authentication tokens updated successfully.
mike,create success
示例二:

循环输出1-10

#!/bin/bash
for ((i=1;i<=10;i++))
do
        echo $i
done
示例三:

用for语句,输出1-100的所有整数和

#!/bin/bash
a=0                                  # 先定义一个和的变量
for ((i=1;i<=100;i++))
do
        a=$(($a+$i))            # 循环赋值(1+..+100)的和给a
done
echo "1-100所有整数相加的和为$a"
示例四:

根据IP地址检测主机状态

# 主机列表
[root@node1 ~]# vim /root/iplist
192.168.100.10
192.168.100.20
192.168.100.30
 
[root@node1 ~]# vim b.sh
#!/bin/bash
ip=$(cat /root/iplist.txt)
for i in $ip
do
ping -c 3 $i &>/dev/null
if [ $? -eq 0 ];then
        echo "$i通"
else
        echo "$i不通"
fi
done
2、while语句

重复测试某个条件,只要条件成立,则反复执行

示例一:

显示0-10的所有整数

#!/bin/bash
a=0
while [ $a -le 10 ]
do
        echo $a
        let a++
done
示例二:

求1-100的整数和

#!/bin/bash
i=0
n=1
while [ $n -le 100 ]
do
i=$(( $i + $n ))
let n++
done
echo "1-100的和为:$i"
随机数:
[root@node1 ~]# expr 555 % 1000
555
[root@node1 ~]# expr $RANDOM % 100
42
[root@node1 ~]# expr $RANDOM % 100
9
[root@node1 ~]# expr $RANDOM % 100
53
[root@node1 ~]# expr $RANDOM % 1000
985
[root@node1 ~]# expr $RANDOM % 1000
639
示例三:

随机猜数字游戏,1000以内的猜数字游戏

#!/bin/bash
num=$(expr $RANDOM % 1000)
a=0
echo "数字范围为0-999的整数,猜猜看"
while true
do
read -p "请输入你猜的整数:" n
let a++
if [ $n -eq $num ];then
	echo "恭喜你答对了,数字为$num"
	echo "你总共猜了$a次"
	exit 0
elif [ $n -gt $num ];then
	echo "你猜高了"
else
	echo "你猜低了"
fi
done
3、until语句

重复测试某个条件,只要条件不成立,则反复执行

示例一:

求1-100的整数和

#!/bin/bash
sum=0                  # 初始化和为0
i=1                    # 初始化计数器为1
until [ $i -gt 100 ]   # 循环直到i大于100
do
  sum=$((sum + i))     # 将当前i的值加到sum上
  i=$((i + 1))         # 将i的值增加1
done
echo "The sum of integers from 1 to 100 is: $sum"
4、双for循环

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

示例一:
#!/bin/bash
for ((a=1;a<=5;a++))
do
        echo "a=$a"
        for ((b=1;b<=5;b++))
        do
                echo "b=$b"
        done
done
5、break和continue
break:

在内循环执行break就跳出当前的内循环,去执行外循环

作用:

1、跳出当前循环

2、并且break下面的语句不去执行

我们可以通过内外循环的输出来看break的特性

[root@node1 ~]# vim d.sh
#!/bin/bash
for(( a=1;a<=5; a++ ))
do
  echo "outside $a"
  for ((b=1;b<=5;b++ ))
  do
     if [ $b -eq 4 ]
      then
      break                   #这里当b=4的时候,进行break,不进行后面的输出$b.
     fi
   echo "inside $b "
  done
 
done

[root@node1 ~]# ./d.sh 
outside 1
inside 1 
inside 2 
inside 3 
outside 2
inside 1 
inside 2 
inside 3 
outside 3
inside 1 
inside 2 
inside 3 
outside 4
inside 1 
inside 2 
inside 3 
outside 5
inside 1 
inside 2 
inside 3

内循环到4就停止了,5就不去判断

continue:

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

[root@node1 ~]# vim d.sh
#!/bin/bash
#continue
for (( a=1;a<=15;a++))
do
    if [ $a -gt 5 ] && [ $a -lt 10 ]
    then
       continue
    fi
   echo " $a "
done
 
[root@node1 ~]# ./d.sh 
 1 
 2 
 3 
 4 
 5 
 10 
 11 
 12 
 13 
 14

二、函数

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

1、shell函数定义格式

function 函数名{

    命令序列

 }

  函数名(){

    命令序列

 }

2、函数返回值

return

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

原则:

1、函数已结束就取返回值,因为 $? 只是对最后一条命令进行判断

2、0-255,超出时,除以256取余

3、echo也能直接返回

测试案例:
[root@node1 ~]# vim a.sh
#!/bin/bash
function cz {
        read -p "请输入任意一个整数值:" n
        return $[$n*2]
}

cz
echo "$?"

[root@node1 ~]# ./a.sh 
请输入任意一个整数值:40
80
[root@node1 ~]# ./a.sh 
请输入任意一个整数值:250
244
[root@node1 ~]# ./a.sh 
请输入任意一个整数值:256
0
3、函数传参
  • 函数变量的作用范围(局部变量以及全局变量)
  • 函数在shell脚本中仅在当前shell环境中有效
  • shell脚本中变量默认全局有效
  • 将变量限定一个函数的内部local,即局部变量
(1)传参:
[root@node1 ~]# vim b.sh
#!/bin/bash
sum1 () {
        sum=$[ $1 + $2 ]
        echo $sum
}
sum1 $1 $2

[root@node1 ~]# ./b.sh 20 30
50
[root@node1 ~]# ./b.sh 1 6
7
(2)变量的局部与全局:

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

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

[root@node1 ~]# vim c.sh
#!/bin/bash
abc () {
        echo "函数内的未经过local的变量i值$i"
        local i
        i=6
        echo "函数内的变量i值是$i"
}
i=9
abc
echo "函数外面的变量i值是$i"

[root@node1 ~]# ./c.sh 
函数内的未经过local的变量i值9
函数内的变量i值是6
函数外面的变量i值是9
(3)local的进阶:
[root@node1 ~]# vim d.sh
#!/bin/bash
abc () {
        echo "inside1 $i"
        let i++
        local i
        i=8
        echo "inside2 $i"
}
i=9
abc
echo "outside $i"

[root@node1 ~]# ./d.sh 
inside1 9
inside2 8
outside 10
4、递归(调用自己)
[root@node1 ~]# vim f.sh
#!/bin/bash
function hyh() {
        if [ $1 -eq 1 ];then
                echo 1
        else
                local temp=$[ $1 - 1 ]
                local result=`hyh $temp`
                echo $[ result * $1 ]
        fi
}
read -p "输入一个值:" vaule
result=`hyh $vaule`
echo "阶乘的值为: $result"

[root@node1 ~]# ./f.sh 
输入一个值:5
阶乘的值为: 120
[root@node1 ~]# ./f.sh 
输入一个值:3
阶乘的值为: 6
5、函数库

就是把一般脚本的主体执行代码和定义函数部分相互分离,把定义的函数部分集中放在同一个脚本中。具体执行的时候,只需要直接进行调用函数集合的脚本文件即可。

这里把加减乘除共4个函数,做了一个函数库。

[root@node1 ~]# vim e.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@node1 ~]# vim f.sh 
#!/bin/bash
. /root/e.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"
 
[root@node1 ~]# chmod +x f.sh 
[root@node1 ~]# ./f.sh 
请输入第一个数字:5 
请输入第二个数字:2
两数之和为: 7
两数之差为: 3
两数之积为: 10
两数之商为: 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值