Shell编程之函数与数组

本文介绍Shell函数与数组的基础知识及应用技巧,涵盖函数定义、参数传递、递归函数及数组操作等内容,帮助读者掌握Shell编程的基本技能。

Shell函数

一、 函数的定义

  1. 将命令序列按格式写在一起

  2. 可方便重复使用命令序列

  3. shell函数定义

    [ function ] 函数名(){
       命令序列
     [return x]      ##使用return或exit可以显式地结束函数
    }    
    

return:可以返回状态码或者数据(echo输出)
exit:只返回状态码

函数体外调用状态码或者值时:
return返回的是状态码,需要使用$?调用
echo 返回的是值,使用变量调用

  1. 调用函数的方法

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

实例:

两个数字求和:
在这里插入图片描述
自定义函数:
编写登录系统后便可使用的用户自定义函数

  • 编辑用户自定义函数文件/root/function
  • 在当前Shell中加载可执行的函数文件/root/function
  • 在~/.bashrc文件中添加source /rootfunction命令
    在这里插入图片描述

二、函数的作用范围

  1. 函数在shell脚本中仅在当前shell环境中有效
  2. shell脚本中变量默认全局有效
  3. 将变量限定在函数内部使用local命令

在这里插入图片描述

三、函数的参数

3.1 参数的用法

函数名称 参数1 参数2 参数3……. 

3.2 参数的表示方法

$1 $2 $3… ${10} ${11}...

在这里插入图片描述

四、递归函数

调用自己本身的函数
实例:
递归遍历目录/var/log
通过定义递归函数list_files来实现
在这里插入图片描述

Shell数组

应用场景包括

  • 获取数组长度
  • 获取元素长度
  • 遍历元素
  • 元素切片
  • 元素替换
  • 元素删除

一、数组定义方法

方法一

数组名=(value0 value1 value2)

例如:arr=(11 22 33 44)

方法二

数组名=([0]=value [1]=value [2]=value)

例如:arr=([0]=11 [1]=22 [2]=33 [3]=44)

方法三

列表名=“value0 value1 value2...”
数组名=($列表名)

例如:list="11 22 33 44"
          arr=($list)

方法四

数组名[0]="value"
数组名[1]="value"
数组名[2]="value"

例如:arr[0]=11
     arr[1]=22
     arr[2]=33
方法四可用来替换掉数组中的某一个元素

二、数组包括的数据类型

  • 数据类型
  • 字符类型
    • 使用“或”定义

三、Shell数组操作

常见数组操作

获取数组长度:

${#数组名[@/*]}

在这里插入图片描述


获取数组元素值:

${数组名[@/*]}

在这里插入图片描述


读取某下标赋值:

${数组名[下标]}

在这里插入图片描述


数组遍历:

在这里插入图片描述


数组切片

${数组名[@]:起始位置:长度}   //中间冒号隔开!!

在这里插入图片描述


数组的替换 重点!!替换元素后再赋值给自己

${数组名[*]/查找字符/替换字符}

在这里插入图片描述


数组删除

unset

在这里插入图片描述

四、Shell脚本调试

echo 命令

bash 命令
命令语法

sh [-nvx] 脚本名

常用选项

选项作用
-n不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
-v在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
-x将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。

在这里插入图片描述

set命令

set -x:开启调节模式
set +x:关闭调节模式

五、Shell给定值的比较

冒泡排序

在这里插入图片描述

键盘输入数组值

#!/bin/bash
k=0
while true
do
read -p "是否需要输入数值[yes/no]:" do
if [ $do == "no" ]    #输入no,即可退出,输入其他继续循环
then break
fi
read -p "请输入第$(($k+1))个元素:" key
score[$k]=$key
let k++
done
 for ((i=1;i<${#score[*]};i++))
do
 for ((j=0;j<${#score[*]}-$i;j++))
 do
   if [ ${score[$j]} -gt ${score[((j+1))]} ]
     then
      temp=${score[j+1]}
         score[((j+1))]=${score[$j]}
         score[$j]=$temp
   fi
 done
done
echo ${score[*]}

[root@localhost ~]# chmod +x maopao1.sh
[root@localhost ~]# ./maopao1.sh
是否需要输入数值[yes/no]:yes
请输入第1个元素:30
是否需要输入数值[yes/no]:yes
请输入第2个元素:40
是否需要输入数值[yes/no]:yes
请输入第3个元素:50
是否需要输入数值[yes/no]:no
30 40 50

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值