!浅识!shell函数及数组

Wesley13
• 阅读 693

Shell 函数及数组

  • SHELL函数

  • 函数的用法

  • 基本格式

  • 函数的调用

  • 示例

  • 函数变量的作用范围

  • 示例

  • 函数的参数

  • 递归函数

  • SHELL 数组

  • 数组定义的方法

  • 数组的基本使用方法:

  • 1.获取数组长度

  • 2.读取某下标赋值

  • 3.数组遍历

  • 4.数组切片

  • 5.数组替换

  • 6.数组删除

SHELL函数

函数的用法

Shell 函数可用于存放一系列的指令。在 Shell 脚本执行的过程中,函数被置于内存中, 每次调用函数时不需要从硬盘读取,因此运行的速度比较快。在 Shell 编程中函数并非是必须的元素,但使用函数可以对程序进行更好的组织。将一些相对独立的代码变成函数,可以提高程序可读性与重用性,避免编写大量重复代码。

基本格式

!浅识!shell函数及数组
“function”关键字表示定义一个函数,可以省略;
“{”符号表示函数执行命令的入口,该符号可以与函数名同行也可以在函数名下一行 的句首;
“}”符号表示函数体结束,两个大括号之间{ }是函数体;
“命令序列”部分可以是任意的 Shell 命令,也可以调用其他函数;
“return”表示退出函数返回一个退出值,通过返回值判断执行是否成功,也可以使用 exit 终止整个 Shell 脚本。

函数的调用

!浅识!shell函数及数组

示例

使用 Shell 脚本实现两个数相加求和,通过定义函数的方式来完成。sum 函数内部通过read 命令接收用户分别输入的两个数,然后做加法运算,最后通过调用函数的方式来输出两个数的和。

#!/bin/bash sum(){
read -p "请输入第一个数:" NUM1 read -p "请输入第二个数:" NUM2
echo “你输入的两个数为: $NUM1 和$NUM2.” SUM=$(( NUM1+$NUM2))
echo “两个数的和为: $SUM”
}
sum

函数变量的作用范围

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

示例

myfun ()
{
local i i=8 echo $i
}
i=9 
myfun 
echo $i

函数的参数

在使用函数参数时,函数名称在前参数在后,函数名和参数之间用空格分隔,可以有多个参数,参数使用$1、$2、 3 … … 的 方 式 表 示 。 以 此 类 推 , 从 第 10 个 参 数 开 始 , 调 用 方 法 为 3……的方式表示。以此类推,从第 10 个参数开始,调用方法为 3……的方式表示。以此类推,从第10个参数开始,调用方法为{10},不加大括号无法调用成功。

递归函数

Shell 也可以实现递归函数,就是可以调用自己本身的函数。在 Linux 系统上编写 Shell 脚本的时候,经常需要递归遍历系统的目录,列出目录下的文件和目录,逐层递归列出,并 对这些层级关系进行展示

function list_files()
{
for f in `ls $1`; do
if [ -d "$1/$f" ]; then echo "$2$f"
list_files "$1/$f" "    $2"
done
}
else fi
echo "$2$f"
list_files "/var/log" ""

SHELL 数组

Shell 脚本中,数组是一种常见的数据结构,主要的应用场景包括:获取数组长度、获取元素长度、遍历元素、元素切片、元素替换、元素删除等等。Shell 中的数组与 Java、C、Python 不同,只有一维数组,没有二维数组。数组元素的大小与限制,也不需要事先定义。Shell 数组用括号()来表示,元素用空格分隔,元素的下标与大部分编程语言类似从 0 开始。

数组定义的方法

!浅识!shell函数及数组

数组的基本使用方法:

1.获取数组长度

[root@localhost ~]# arr_number=(1 2 3 4 5)
[root@localhost ~]# arr_length=${#arr_number[*]} 
[root@localhost ~]# echo $arr_length
5
[root@localhost ~]# arr_length_1=${#arr_number[@]}

[root@localhost ~]# echo $arr_length_1
5

2.读取某下标赋值

[root@localhost ~]# arr_index2=${arr_number[2]}      ##第三个元素
[root@localhost ~]# echo $arr_index2
3

3.数组遍历

[root@localhost ~]# vim array_traverse.sh
#!/bin/bash 
arr_number=(1 2 3 4 5) 
for v in ${arr_number[@]} 
 do
 echo $v 
 done

4.数组切片

[root@centos-7 ~]# arr=(1 2 3 4 5)
[root@centos-7 ~]# echo ${arr[@]}    //输出整个数组1 2 3 4 5
[root@centos-7 ~]# echo ${arr[@]:0:2}    //${数组名[@或*]:起始位置:长度} 1 2
[root@centos-7 ~]# echo ${arr[@]:2:3}
3 4 5

5.数组替换

[root@centos-7 ~]# arr=(1 2 3 4 5)
[root@centos-7 ~]# echo ${arr[@]/4/66}    //${数组名[@或*]/查找字符/替换字符} 1 2 3 66 5
[root@centos-7 ~]# echo ${arr[@]}    //并不会替换数组原有内容1 2 3 4 5
[root@centos-7 ~]# arr=(${arr[@]/4/66})    //要实现改变原有数组,可通过重新赋值实现[root@centos-7 ~]# echo ${arr[@]}
1 2 3 66 5

6.数组删除

[root@centos-7 ~]# arr=(1 2 3 4 5)
[root@centos-7 ~]# unset arr    //删除数组[root@centos-7 ~]# echo ${arr[*]}

[root@centos-7 ~]# arr=(1 2 3 4 5)
[root@centos-7 ~]# unset arr[2]    //删除第三个元素[root@centos-7 ~]# echo ${arr[*]}
1 2 4 5
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这