【Shell】Shell函数与数组

目录

一、函数

1.1 定义

1.2 调用、查看与删除

1.3 返回值

1.4 传参数

1.5 阶乘的实现

二、数组

1.1 定义

1.2 获取数组

1.3 数组切片


一、函数

1.1 定义

基本格式:

格式一:
function 函数名 {
        命令序列
}


格式二:
函数名() {
        命令序列
}


格式三:
function 函数名() {
        命令序列
}

注意事项

  1. 直接写 函数中调用函数 直接写函数名
  2. 同名函数 后一个生效
  3. 调用函数一定要先定义
  4. 每个函数是独立 

1.2 调用、查看与删除

调用方式:

func1 () {       #在当前环境中,将a=10
a=10
}

func1        #调用函数

若在本地bash环境中调用函数,则会改变本地的shell环境 

 查看方式:

declare -F    #查看函数列表,只能看到函数名
declare -f    #查看函数列表,可以看到函数具体内容
declare -f 函数名    #查看特定函数的内容
declare -F 函数名    #查看特定函数的函数名

删除方式:

unset 函数名

1.3 返回值

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

使用原则:

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
  2. 退出码必须是0-255,超出的值将为除以256取余
#!/bin/bash

test() {
    read -p "请输入一个数字:" num
    return $[$num*2]    #修改返回值为num*2
}


test1      #调用函数
echo $?    #查看返回值

1.4 传参数

函数变量的作用范围:

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

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

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

#!/bin/bash


global=10    #全局变量

test (){

local global=20    #local表示将当前变量值仅限定在函数内部
echo $global

}


test    #调用函数  global=20

echo $global    #global=10

1.5 阶乘的实现

#!/bin/bash


func1 (){
    if [ $1 -eq 1 -o $1 -eq 0 ]    #1和0的阶乘都是1
    then echo 1
    else
    local tmp=$[ $1-1 ]            #定义输入数的前一个数
    local result=$(func1 $tmp)     #得到前一个数的阶乘
    echo $[ $1*$result ]           #计算阶乘 
    fi
}

read -p "请输入:" n
result=$(func1 n)    #放入函数中计算阶乘
echo $result         #得到结果

二、数组

1.1 定义

数组分为:

  • 普通数组        索引编号从0开始
  • 关联数组        索引为自定义
  • 变量:存储单个元素的内存空间

  • 数组:存储多个元素的连续的内存空间,相当于多个变量的集合

  • 索引的编号从0开始,属于数值索引

  • 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持

  • bash的数组支持稀疏格式(索引不连续)

普通数组可以不事先声明,直接定义

格式一:
数组名 = (value1 value2 value3 ...)

格式二:
数组名 = ([0]=value [1]=value [2]=value ...)

格式三:
列表名 = "value1 value2 value3 ..."
数组名 = ($列表名)

格式四:
数组名[0]="value1"
数组名[1]="value2"
数组名[2]="value3"
关联数组必须事先声明,再使用

格式:
declare -A 数组名
数组名[索引名1]=value1
数组名[索引名2]=value2
数组名[索引名3]=value3
        ...
        ...


举例:
declare -A family
family[population]=8
family[first_name]=smith
family[car]=bwm

1.2 获取数组

a=(1 2 3 4 5)    #定义数组

echo ${a[*]}     #获取a数组数据列表
echo ${a[@]}     #获取a数组数据列表

echo ${#a[*]}    #获取a数组索引个数
echo ${#a[@]}    #获取a数组索引个数

echo ${!a[@]}    #获取a数组的所有索引
echo ${!a[*]}    #获取a数组的所有索引


【数组的遍历】
#!/bin/bash
a=(1 2 3)
for i in ${a[*]}
do
    echo $i
done

1.3 数组切片

a=(1 2 3 4 5)

echo ${a[@]:2:3}    #跳过2个元素,并且取出3个元素,结果为3 4 5

echo ${a[*]/3/66    #显示数组a的数据列表,且第三个数显示为66

unset a    #删除数组a
unset a[2]    #删除数组a中索引为2的元素

1.4 求数组中的最大值

#!/bin/bash

read -p "请定义一个数组的内容:" n
arr=($n)
max=arr[0]

for ((i=0;i<=${#arr[*]}-1;i++))
do
    if [[ $max -lt ${arr[$i+1]} ]]
    then
    max=${arr[$i+1]}
    else 
    continue
    fi
done

echo "最大值为:$max"
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值