函数与数组

文章目录

  • 函数与数组
    • 一、函数
      • 1、函数定义
      • 2、函数基本格式
      • 3、函数调用方法
      • 4、查看函数
      • 5、删除函数
      • 6、函数的返回值
        • 6.1 使用原则
        • 6.2 函数的退出状态码
      • 7、函数的传参数
      • 8、函数变量的作用范围
      • 9、函数递归
    • 二、数组
      • 1、数组的定义
      • 2、数组格式
      • 3、数组的数据类型
      • 4、声明数组
      • 5、获取数组列表
      • 6、获取数组长度
      • 7、获取数组下标值
      • 8、数组的基本使用方法
        • 8.1 数组元素的遍历
        • 8.2 数组切片
        • 8.3 数组替换
        • 8.4 数组删除
      • 9、取出数组中的最大值和最小值
      • 10、冒泡排序

函数与数组

一、函数

1、函数定义

  • 将命令序列按格式写在一起
  • 可方便重复使用命令序列
#定义函数
[root@localhost data]#func (){ hostname;uname -r; }

#调用
[root@localhost data]#func
localhost.localdomain
3.10.0-693.el7.x86_64

函数与数组_第1张图片

2、函数基本格式

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

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

3、格式三:
function func_name () {
 ...函数体...
} 

注意事项

  • 直接写函数中调用函数,直接写函数名
  • 同名函数,后一个生效
  • 调用函数一定要先定义
  • 每个函数是独立

3、函数调用方法

  • 先定义,再调用
[root@localhost data]#vim ww.sh
#!/bin/bash
q () {
#q表示定义的函数名
  echo "nihao"
#命令序列
}
q
#此处的q表示调用这个函数

[root@localhost data]#bash ww.sh
nihao

函数与数组_第2张图片

#判断操作系统
[root@localhost data]#vim xitong.sh
#!/bin/bash
os () {
if grep -q centos /etc/os-release;then
  echo "centos"
#如果是操作系统是centos,则输出centos
elif grep -q ubuntu /etc/os-release;then
  echo "ubuntu"
#如果是操作系统是ubuntu,则输出ubuntu
else
  echo "can not support"
#如果都不是以上操作系统,则输出can not support
fi
 }
os
#调用

函数与数组_第3张图片

4、查看函数

declare -F
#查看当前已定义的函数名

declare -f
#查看当前已定义的函数定义(查看函数具体信息)

declare -f func_name 
#查看指定当前已定义的函数名

declare -F func_name
#查看当前已定义的函数名定义
#查看当前已定义的所有函数名
[root@localhost data]#declare -F
declare -f __HOSTNAME
declare -f __SIZE
declare -f __SLAVEURL
declare -f __VOLNAME
declare -f __expand_tilde_by_ref
declare -f __get_cword_at_cursor_by_ref
declare -f __ltrim_colon_completions
declare -f __parse_options
declare -f __reassemble_comp_words_by_ref
declare -f _allowed_groups
declare -f _allowed_users
declare -f _available_fcoe_interfaces
declare -f _available_interfaces
declare -f _cd
declare -f _cd_devices
……

函数与数组_第4张图片

#查看当前已定义的函数定义(查看函数具体信息)
[root@localhost data]#declare -f
__HOSTNAME ()
{
    local zero=0;
    local ret=0;
    local cur_word="$2";
    if [ "$1" == "X" ]; then
        return;
    else
        if [ "$1" == "match" ]; then
            return 0;
        else
            if [ "$1" == "complete" ]; then
                COMPREPLY=($(compgen -A hostname -- $cur_word));
            fi;
        fi;
    fi;
    return 0
}
……

函数与数组_第5张图片

5、删除函数

unset 函数名
#删除函数

6、函数的返回值

  • return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
6.1 使用原则
  • 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
  • 退出码必须是0-255,超出的值将为除以256取余
6.2 函数的退出状态码

默认取决于函数中执行的最后一条命令的退出状态码
自定义退出状态码,其格式为:

  • return 从函数中返回,用最后状态命令决定返回值
  • return 0 无错误返回
  • return 1-255 有错误返回
[root@localhost data]#vim dz.sh
#!/bin/bash
ip () {
  read -p "请输入一个ip地址:"  host
[[ "$host" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || { echo "$host ip地址是非法的";return 1; }
#return 1表示执行脚本后,自定义的一个退出状态码(范围是0~255)
}
ip
echo $?

#验证
[root@localhost data]#bash dz.sh
请输入一个ip地址:192.168.10.1128
192.168.10.1128 ip地址是非法的
1
[root@localhost data]#bash dz.sh
请输入一个ip地址:192.168.10.13
0
[root@localhost data]#bash dz.sh
请输入一个ip地址:192.168.10.100
0

函数与数组_第6张图片

7、函数的传参数

函数传参是指在调用自定义函数时向该函数传递参数的过程。这些参数可以

在函数内部作为变量使用,以便函数能够根据传入的数据执行不同的任务或操作

[root@localhost data]#vim test.sh
#!/bin/bash
q () {
echo "第一个参数是 $1 $2 $3"
}
q $1 $2 $3

[root@localhost data]#bash test.sh xx01 xx02 xx03
第一个参数是 xx01 xx02 xx03


[root@localhost data]#vim test.sh
#!/bin/bash
q () {
echo "第一个参数是 $1 $2 $3"
}
q $2 $1 $3

[root@localhost data]#bash test.sh xx01 xx02 xx03
第一个参数是 xx02 xx01 xx03
#输入参数的顺序就是位置参数的顺序

函数与数组_第7张图片

8、函数变量的作用范围

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

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

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

[root@localhost data]#name=qi
[root@localhost data]#func1 (){ name=xxx;echo $name; }
[root@localhost data]#func1
xxx
[root@localhost data]#echo $name
xxx

[root@localhost data]#name=qi
[root@localhost data]#func1 (){ local name=xxx;echo $name; }
[root@localhost data]#func1
xxx
[root@localhost data]#echo $name
qi
#函数变量会影响当前环境,使用local命令将变量限制在函数内

函数与数组_第8张图片

9、函数递归

  • 函数调用自己本身的函数
  • 必须要有结束函数的语句,防止死循环
#用循环语句for求阶乘
[root@localhost data]#vim qaz.sh
#!/bin/bash
sum=1
read -p "请输入一个数字:" num
for i in `seq $num`
do
let sum=$[i*sum]
done
echo $sum

#验证
[root@localhost data]#bash qaz.sh
请输入一个数字:5
120
[root@localhost data]#bash qaz.sh
请输入一个数字:6
720

函数与数组_第9张图片

#用函数求阶乘
[root@localhost data]#vim jc.sh
#!/bin/bash
fact () {
if [ $1 -eq 1 ];then
echo 1
#定义变量,表示数字是1时,阶乘就是1
else
local temp=$[$1-1]
#表示求num的阶乘,先要知道num-1的结果
local result=`fact $temp`
#定义变量,表示将数字代入fact $temp中计算阶乘结果
echo $[$1*result]
fi
}
fact $1

#验证
[root@localhost data]#bash jc.sh 6
720
[root@localhost data]#
[root@localhost data]#bash jc.sh 5
120

函数与数组_第10张图片

二、数组

1、数组的定义

  • 使用括号包含数组中的元素,每个元素都有自己的下标索引,下标起始值为 0,数组中元素可以为数组或字符创等
[root@localhost data]#a=(10 20 30 40 50 60)
[root@localhost data]#echo ${a[0]}
10
[root@localhost data]#echo ${a[1]}
20
[root@localhost data]#echo ${a[2]}
30
[root@localhost data]#echo ${a[@]}
10 20 30 40 50 60
[root@localhost data]#echo ${a[*]}
10 20 30 40 50 60

函数与数组_第11张图片

2、数组格式

1、格式一:
 数组名=(value0  value1 value2 value3 ......2、格式二:
 数组名=[0]=value   [1]=value1  [2]=value2 ....3、格式三:
 列表名="value0  value1 value2 value3 ...... "
 数组名=($列表名)

4、格式四:(追加,修改)
 数组名[0]="value1"
 数组名[1]="value2"
 数组名[2]="value3"
 
5、格式五:(交互式)
 read -a 

3、数组的数据类型

  • 数值类型
  • 字符类型(字符串):使用“x”或 'x’定义,防止元素当中有空格,元素按空格分割

4、声明数组

  • 使用关联数组前必须先声明,再使用,否则会发生混乱
#普通数组可以不事先声明,直接使用
declare -a 
#关联数组必须先声明,再使用
declare -A 
[root@localhost data]#declare -A th
#先声明关联数组th
[root@localhost data]#th[aaa]=1
[root@localhost data]#th[bbb]=xx
[root@localhost data]#th[ccc]=user

#调用(调用结果正常,不会发生混乱)
[root@localhost data]#echo ${th[aaa]}
1
[root@localhost data]#echo ${th[bbb]}
xx

函数与数组_第12张图片

5、获取数组列表

echo ${数组名[*]}
echo ${数组名[@]}
[root@localhost data]#a=(10 20 30 40 50 60)
[root@localhost data]#echo ${a[@]}
10 20 30 40 50 60
[root@localhost data]#echo ${a[*]}
10 20 30 40 50 60

函数与数组_第13张图片

6、获取数组长度

echo ${#数组名[*]} 
echo ${#数组名[@]} 
echo ${!数组名[@]}  #显示下标 
echo ${数组名[索引值]}  #输出数组索引值对应的元素,索引值为从0开始
[root@localhost ~]#a=( 10 20 30 40 50 )
[root@localhost ~]#echo ${#a[*]}
5
[root@localhost ~]#echo ${#a[@]}
5
[root@localhost ~]#echo ${!a[@]}
0 1 2 3 4
[root@localhost ~]#echo ${a[4]}
50

函数与数组_第14张图片

7、获取数组下标值

数组名=(元素0  元素1  元素2  ……)					
#定义数组
echo ${数组名[索引值]}							
#输出数组索引值对应的元素,索引值为从0开始

8、数组的基本使用方法

8.1 数组元素的遍历
  • 对数组所有元素进行访问,根据需要对所需要的元素进行操作
[root@localhost data]#vim xx.sh
#!/bin/bash
a=( 10 20 30 40 50 60 )
for i in ${a[@]}
do
echo $i
done
[root@localhost data]#bash xx.sh
10
20
30
40
50
60

函数与数组_第15张图片

8.2 数组切片
[root@localhost data]#a=( 10 20 30 40 50 )
[root@localhost data]#echo ${a[@]:2:1}
30
#从第2个开始,打印后面1个
[root@localhost data]#echo ${a[@]:2}
30 40 50
#从第2个开始,打印后面所有

函数与数组_第16张图片

8.3 数组替换
  • 格式:${数组名[@]/查找字符/替换字符}
[root@localhost data]#a=( 10 20 30 40 50 )
[root@localhost data]#echo ${a[@]/20/22}
10 22 30 40 50
#将20替换为22

image-20240131220039004

8.4 数组删除
  • 格式:unset 数组名
[root@localhost data]#a=( 10 20 30 40 50 )
[root@localhost data]#unset a
#删除数组
[root@localhost data]#echo ${a[@]}

[root@localhost data]#a=( 10 20 30 40 50 )
[root@localhost data]#unset a[3]
#删除下标为3的字符
[root@localhost data]#echo ${a[@]}
10 20 30 50

函数与数组_第17张图片

9、取出数组中的最大值和最小值

#取数组中的最大值
[root@localhost data]#vim ww.sh
#!/bin/bash
read -p "请输入数组:" num
a=($num)
max=${a[0]}
l=${#a[@]}
for ((i=0;i<$l;i++))
do
if [[ $max -lt ${a[$i+1]}  ]]
then
max=${a[$i+1]}
fi
done
echo $max

#验证
[root@localhost data]#bash ww.sh
请输入数组:11 22 33 44 55 66
66

函数与数组_第18张图片

#取数组中的最小值
[root@localhost data]#vim ww.sh
#!/bin/bash
read -p "请输入数组:" num
a=($num)
min=${a[0]}
for ((i=0;i<${#a[@]}-1;i++))
do
if [[ $min -ge ${a[$i+1]} ]]
then
min=${a[$i+1]}
fi
done
echo $min

#验证
[root@localhost data]#bash ww.sh
请输入数组:12 54 23 10 28 16
10

函数与数组_第19张图片

#取数组中最大最小值
[root@localhost data]#vim ww.sh
#!/bin/bash
for i in {0..9}
do
  a[$i]=$RANDOM
   [ $i -eq 0  ] &&  min=${a[0]}  &&  max=${a[0]}
   [ ${a[$i]} -gt  $max   ] && max=${a[$i]}
   [ ${a[$i]} -lt  $min   ] && min=${a[$i]}
done
echo  ${a[@]}
echo max=$max
echo min=$min

#验证
[root@localhost data]#bash ww.sh
3381 17295 31518 1029 28915 882 26524 17146 26545 11764
max=31518
min=882

函数与数组_第20张图片

10、冒泡排序

冒泡排序就是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(将两个元素的位置交换),这样较小的元素就像气泡一样从底部上升到顶部。

  • 排序算法:类似于气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动
[root@localhost data]#vim xx.sh
#!/bin/bash 
for i in {0..9}
do
  a[$i]=$RANDOM
done
l=${#a[@]}
for ((i=1;i<l;i++))
do
  for  ((j=0;j<l-i;j++))
  do
   first=${a[$j]}
   k=$[j+1]
   second=${a[$k]}
   if  [[ $first -gt $second ]]
   then
   temp=$first
   a[$j]=$second
   a[$k]=$temp
   fi
  done
done
echo ${a[@]}

#验证
[root@localhost data]#bash xx.sh
532 1455 3806 4851 13327 19564 20539 25252 28395 31752
[root@localhost data]#
[root@localhost data]#bash xx.sh
3315 10565 11395 11656 13473 15993 22154 22575 29378 32576
[root@localhost data]#
[root@localhost data]#bash xx.sh
1145 6146 12651 15228 21022 24752 25416 25782 26332 29219

函数与数组_第21张图片

你可能感兴趣的:(linux)