shell 函数和数组

shell 函数应用

函数应用场景:有一些命令需要反复调用执行,若每次使用同一命令就重复写一遍,就会导致代码量很大。为了解决还问题,可以将命令序列按格式写在一起,以便可以重复的使用。

shell 函数格式

[ function ] 函数名 {
命令序列
[return x]
}

调用函数的方法

函数名 [参数1] [参数2]

递归函数

调用自己本身的函数

函数应用实例

#!/bin/bsh 
a (){
echo "hello"
}

b (){
echo "world"
}
c (){
echo `a` `b`
}
c

在这里插入图片描述
值得注意的是函数都是上往下读的,用"``"显示其他函数时,必须在调用之前,否则,会读不到。
如:

#!/bin/bsh 
a (){
echo "hello"
}

c (){
echo `a` `b`
}
c
b (){
echo "world"
}

在这里插入图片描述

函数的位置变量

函数可以使用位置变量,直接在调用函数时写入即可,当执行脚本时,脚本里的位置变量传递给函数

#!/bin/bsh 
NUM (){
let NUM=$1+$2
echo "$NUM"
}
NUM $1 $2

在这里插入图片描述
当调用函数后面存在相同变量时,函数中的变量值会被替换

#!/bin/bsh 
aa () {
a=10
echo $a
}
aa
a=100
echo $a

在这里插入图片描述
当调用函数前面存在相同变量时,函数前的变量值会被替换

#!/bin/bsh 
aa () {
a=10
echo $a
}
a=100
aa
echo $a

在这里插入图片描述

当函数定义本地变量时,只有在调佣函数时,变量值才有效,不改变相同变量的值

#!/bin/bsh 
aa () {
local a=10
echo $a
}
a=100
aa
echo $a

在这里插入图片描述

当存在相同函数名的时候,前面的函数会被后面的函数所覆盖

#!/bin/bsh 
aa () {
 a=10
echo $a
}

aa () {
a=1000
echo $a
}
aa

在这里插入图片描述

函数的命令执行返回码

函数执行的返回码是函数最后命令执行的结果,即看最后一条命令执行是否执行成功看“$?”是否为0,我们也可以自定义返回码,通过返回码(0-255)的数值来判断命令的执行情况
在这里插入图片描述

自定义返回码

在这里插入图片描述
在这里插入图片描述
值得注意的是当函数命令序列中有return的时候,就会返回退出函数,不户会执行函数中还没执行的命令。

我们可以用函数来定义返回码,查看文件是否存在

#!/bin/bash
file (){
if [ -e $1 ];then
  return 100
else
  return 200
fi
}
file $1
if [ $? -eq 100 ];then
     echo "改文件已存在"
else
   echo "改文件不存在"
fi

在这里插入图片描述

函数应用实例一:求1到任意数的的和,要求根据自己意愿可以求总数和,和偶数和

#!/bin/bash
b=0
#!/bin/bash
b=0
read -p "你是要求1到多少求和: " sum
zongshu(){
for a in `seq $sum`
do
let  b=$a+$b
done
echo $b
}
oushu(){
for a in `seq $sum`
do
if [ $((a%2)) -eq 0 ];then
let b=$a+$b
fi
done
echo $b
}
if [ $1 == 总数 ];then
zongshu
elif [ $1 == 偶数 ];then
oushu
else
echo "参数错误"
fi

函数应用实例二:求数的阶乘

#!/bin/bash 
jiecheng(){
a=1
for b in `seq $1`
do
let a=$b*$a
done
echo $a
}
jiecheng $1

在这里插入图片描述

shell 数组

同一数据类型,把它们放在同一列表里面,便于我们去使用
应用场景包括
●获取数组长度
●获取元素长度
●遍历元素
●元素切片
●元素替换
●元素删除
数组的定义和删除

a=(1 2 3 4 5)   //定义数组的值
a=(1 2 zhangsan lisi)
b=([0]=1 [1]=2 [2]=3 [3]=4)  //定义数组的值
b[3]=5    //改变数组的值
unset b[3]  //删除数组的元素
unset b      //删除数组
[root@localhost ~]# list="a b c d"
[root@localhost ~]# list1=($list)
[root@localhost ~]# echo ${list1[*]}
a b c d
[root@localhost ~]# list=`cat /etc/passwd`
[root@localhost ~]# list1=($list)
[root@localhost ~]# echo ${#list1[*]}
96
[root@localhost ~]# echo ${list1[o]}
root:x:0:0:root:/root:/bin/bash

数组的查看

declare -a 

在这里插入图片描述

数组的调用

echo ${a[索引]}
echo ${a[*]}  //表示取数组的所有元素
echo ${a[@]}  //表示取数组的所有元素

在这里插入图片描述
在这里插入图片描述

数组切片调用

[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ~]# echo ${a[*]:1:4} //从第二个开始取,取4个
2 3 4 5

数组的替换

[root@localhost ~]# echo ${a[*]/5/15}
1 2 3 4 15
[root@localhost ~]# echo ${a[*]}
1 2 3 4 5   //只是零时看一下效果,元素值并没有变

查看数组的元素个数

echo ${#a[*]}
echo ${#a[@]}

在这里插入图片描述

查看数组下标

echo ${!a[@]}
echo ${!a[*]}

在这里插入图片描述

数组遍历

#!/bin/bash 
a=(1 2 3 4 5)
for i in ${a[*]}
do
echo $i 
done
#!/bin/bash 
a=(1 2 3 4 5)
for ((i=0;i<${#a[*]};i++))
do
echo ${a[$i]}
done
#!/bin/bash 
a=(1 2 3 4 5)
i=0
while [ $i -le ${#a[*]} ]
do
echo ${a[$i]}
let i++
done

数组应用实例一:打印数组

#!/bin/bash
for ((a=0;a<10;a++))
do
let c=$a+1
b[$a]=$c
done
echo "${b[*]}"
#b[0]=1
#b[1]=2

数组应用实例二:输出数组当中最大的数

#!/bin/bash
a=(10 20 30 40 50 60)
max=a[0]
for ((i=1;i<${#a[*]};i++))
do
if [[ $max -lt ${a[$i]} ]];then
 max=${a[$i]}
fi
done
echo $max
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值