栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Shell编程之Shell函数与数组

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Shell编程之Shell函数与数组

文章目录
  • Shell函数
    • 将命令序列按格式写在一起
    • 可方便重复使用命令序列
    • Shell函数定义
    • 函数调用的方法
  • 函数返回值
  • 函数的作用范围
  • 函数的参数
    • 参数的用法
    • 参数的表示方法
  • 递归函数
  • Shell数组
    • 数组的定义
    • 数组的分类
    • 应用场景包括
    • 数组定义方法
    • 数组包括的数据类型

Shell函数 将命令序列按格式写在一起 可方便重复使用命令序列 Shell函数定义

函数名(){

命令序列

}
函数名

例:


函数调用的方法

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

调用函数,是从上往下依次执行

f1 (){
 echo 变量名
}
f3 (){
 echo "$(f1) $(f2)"
}

f2 (){
echo 变量名
}
f3   ——放这就是到这才结束


例1:

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

b () {
echo "你好"
}

hi () {
a
b
}

a
b
hi



例2:

#!/bin/bash
 
#定义函数
os (){
if  grep -i -q "CentOS Linux 7 " /etc/os-release
then 
 echo "此操作系统是centos 7"


elif  grep -i -q "CentOS Linux 6 " /etc/os-release
then 
 echo "此操作系统是centos 6"

elif  grep -i -q "CentOS Linux 8 " /etc/os-release
then 
 echo "此操作系统是centos 8"
fi
}

#调用函数
os

函数返回值

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

1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余

例1:return返回一个乘积


例2:求和

函数的作用范围
  • 函数在Shell脚本中仅在当前Shell环境中有效
  • Shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令

PS:

  • 函数内部变量通过 local 来实现
  • 通过定义 myfun 函数,在其内部设置局部变量 i
  • 函数内部和外部分别赋值,进行结果验证。

例:全局变量与局部变量的区别
Local 定义变量只能在内部使用,6为局部变量,8为全局变量

#!/bin/bash
myfun (){
local i 
i=6

echo $i

}
i=8

myfun
echo $i


local 的定义等于本地执行的,local i 代表先执行完本地的再执行本地以外的,i=8

注意,若把 local i 注释了,i 就为全局变量,如果它为全局变量时,它是从上往下执行命令,系统只会承认第一个定义的 i 的值,之后所有的“ i ”不管在定义什么,都是第一个定义的值。


local i 被注释时,它就代表为一个全局

函数的参数 参数的用法
函数名称 参数1 参数2 参数3 ……
参数的表示方法
  • $1 $2 $3 …… ${10} ${11}……

例1:求前数与后数相乘的结果

#!/bin/bash
abcd (){
dart=1
for i in {1..6}
do
let dart=$i*$dart
echo $dart
done
}
abcd

例2:求1到6的阶乘

#!/bin/bash
#求阶乘1到6的阶乘
abcd (){
dart=1
for i in {1..6}
do
let dart=$i*$dart
done
echo $dart

}
abcd


递归函数
  • 调用自己本身的函数

给命令行提示字符加颜色
PS1="[e[1;34m][u@h W]\$[e[0m] "

PS1="[e[1;35m][[e[1;34m]u[e[1;36m]@[e[1;34m]h [e[1;31m]w[e[1;35m]][e[1;36m]\$[e[0m] "

[e[1;35m][ —— 定义左边的"["
[e[1;34m]u ——定义用户名
[e[1;36m]@ —— 定义"@"
[e[1;34m]h —— 定义第一个点(.)之前的主机名 //34代表文件
[e[1;31m]w —— 定义目录完整路径
[e[1;35m]] —— 定义"]"
[e[1;36m]\$ —— 定义"#"或"$"
[e[0m] —— 一段不显示字串的结束

例2:
递归显示 var 下的 log 里面有哪些是目录

若是目录就显示为蓝色判断目录下,有哪些目录,打印显示出,不显示文件

[root@ky19 ~]# vim dart7.sh 
#!/bin/bash
#列出目录文件的列表,目录可用颜色表示(蓝色表示目录;白色表示文件)文件显示层及关系
list (){
for i in $1/*  #$1下面的所有内容
do
   if [ -d $i ];then   #-d代表是目录 只要是目录的我就用蓝色显示
   echo -e "e[34m$ie[0m"
#标准格式 [ ] 里面的内容是表示颜色  -e表示转义字符标识
   echo $i
   list $i " $2"
   else
   echo "$2$i"
   fi
done
}
list $1 $2 #调用变量


例3:交互式 递归方式计算你输入的数值作为阶乘

#!/bin/bash
#交互式 递归方式计算你输入的数值作为阶乘
#比如我第一次输入5
fun (){
if [ $1 -eq 1 ];then
  echo 1
else
#5不等于1执行else的 此时tp=5-1=4;res=4 此时echo为5*4
  local tp=$[ $1 - 1 ]  #这个是局部  
  res=$(fun $tp)  #相当于直接调用tp本身
  echo $[ $1 * $res ] #$1是5
fi
}

read -p "请输入:" num
res=$(fun $num)
echo $res


#执行过程
#fun 5 $1=5 tp=4 res=fun 4 echo 5 * 4()      5*4*3*2*1
#fun 4 $1=4 tp=3 res=fun 3 echo 4 *3(fun)    4*3*2*1
#fun 3 $1=3 tp=2 res=fun 2 echo 3 * 2(fun)   3*2*1
#fun 2 $1=2 tp=1 res=fun 1 echo 2*1(fun)     2*1
#fun 1 $1  echo 1                            1  

Shell数组 数组的定义
  • 数组中可以存放多个值。Bash Shell 只支持一堆数组(不支持多维数组)

  • 数组元素的下标由 0 开始

  • Shell 数组用括号来表示,元素用“空格”符合分割开

  • 在 shell 语句中,使用、遍历数组的时候,数组格式要写成 ${arr[@]} 或 ${arr[*]}

    数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用

数组的分类
  • 普通数组:不需要声明直接定义,下标索引只能是整数
  • 关联数组:需要用declare -A晟敏否则系统不识别,索引可以是字符串
应用场景包括
  • 获取数组长度
  • 获取元素长度
  • 遍历元素
  • 元素切片
  • 元素替换
  • 元素删除
  • ……
数组定义方法

(10 20 30 40 50 60)
( 0 - 1 - 2 - 3 - 4 - 5 )

方法一:直接把要加入数组的元素用小括号括起来,中间用空格分开
num=(10 20 30 40 50) 
$(#num)   ——显示字符串长度
数组名=(value0 value1 value2)

方法二:精确的给灭一个下标索引定义一个值加入数组,索引数字可以不连接
num=([0]=55 [1]=66 [2]=77 [3]=88)

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

方法三:先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组

list=“11 12 13 14”
num=($list)

方法四:可以把命令的结果用小括号括起来添加到数组,那么数组会以空格或者制表符区分每一个元素


num=(`cat /etc/passwd`)
[root@ky19 ~]# echo ${#num[*]}
111
[root@ky19 ~]# echo ${num[0]}
root:x:0:0:root:/root:/bin/bash
1
2
3
4
5

注意特殊方式:
[root@ky19 ~]# list[0]=1    //没有定义数组之前也可这样直接定义元素
[root@ky19 ~]# echo ${list[*]}
1

[root@ky19 ~]# list=([0]=1 [1]=2 [3]=4)    //定义数组时所以可以是不连续的
[root@ky19 ~]# echo ${list[*]}
1 2 4
[root@ky19 ~]# echo ${!list[*]}       //没有2这个索引,数组元素为3
0 1 3


[root@ky19 ~]# ff=(1 2 huba dart)    //不是同一数据类型的也可定义为一个数组
[root@ky19 ~]# echo ${ff[*]}
1 2 huba dart
数组包括的数据类型
  • 数值类型
  • 字符类型
    • 使用‘ ’或“ ”定义
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/860431.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号