shell函数与数组(了解函数,递归函数运用,了解数组,创建基数和偶数数组,冒泡排序,调试命令)
文章目录
- shell函数
- 了解函数
- 函数定义
- 递归函数
- 举例子
- shell数组
- 定义数组
- 数组包括的数据类型与数组操作
- 数组操作
- 举例(快速创建数组、奇数数组)
- 冒泡排序法
- 调试命令
- set命令
- bash/sh
shell函数
了解函数
1、在编写shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,既可以成为函数
2、合理使用shell函数,可以使脚本更加简洁,增强程序的易读性,提高执行效率
函数定义
- return返回的是状态码,需要使用$?调取
- echo 返回的是值,使用变量调用
函数
#!/bin/bash
function xue(){read -p "请输入第一个整数" naread -p "请输入第二个整数" nbname=$[$na+$nb] echo $name return 100 返回状态码
}
number=`xue` 赋予namber值
echo $? 显示状态码
echo $number 显示出值多少
root@192 ~]# sh c.sh
输入你的一个整数10
输入你的二个整数20
100
和:30
[root@192 ~]# echo $?
0
全局声明函数
如果你希望直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用
#!/bin/bash
function xue(){read -p "请输入第一个整数" naread -p "请输入第二个整数" nbname=$[$na+$nb]echo $namereturn 100
}
[root@localhost ~]# vim .bashrc (局部声明)
[root@localhost ~]# source .bashrc (更新)
[root@192 ~]# xue
请输入第一个整数1
请输入第二个整数2
3
递归函数
递归就是程序不断调用自身,递归方法就是方法直接或间接调用自身的方法。自己调用自己
举例子
列举出/var/log/下所有的文件,使用层次性输出。
#!/bin/bashfunction list_files(){for f in ` ls $i`doif [ -d "$1/$f" ];thenecho "$2$f "list_files "$1/$f"" $2 "elseecho "$2$f"fidone
}
list_files "/var/log" ""
[root@192 ~]# sh acd.txt
1.sh
2
2.txt
3
abn.sh
acd.txt
a.txt
backup
b.sh
c.sh
e.txt
httpd-2.4.25.tar.gz
ls.txr
opt.zhang
o.txt
公共
模板
视频
图片
文档
下载
音乐
桌面
shell数组
数组就是把有限个元素变量或数组用一个名字命名,然后用编号区分他们的变量的集合。这个名字成为数组名,编号成为数组下标。组成数组的各个变量成为数组的分量,也称为数组的元素,有时也称为下标变量。
- 获取数组长度
- 使用for循环获取具体信息,使用下标或索引标记数组中数据的位置
- 可以存放多种数据,如:整型,长整形,浮点型(单精度,双精度),字符串等
- 获取元素长度
- 遍历元素
- 元素切片
- 元素替换
- 元素删除
- 数组下标从0开始算
- 数组长度从1开始算
定义数组
方法1
基本格式log
数组名=(log0 log1 log2...)
例如
ABC=(11 22 33 44)
[root@promote ~]# zhang=(11 22 33 44 55 )
[root@promote ~]# echo $zhang
11
[root@promote ~]# echo ${zhang[*]}
11 22 33 44 55
[root@promote ~]# echo ${zhang[@]}
11 22 33 44 55
方法2
基本格式
数组名=([0]=value [1]=value [2]=value...)
[root@promote ~]# wan=([0]=33 [1]=44 [2]=55 [3]=66 )
[root@promote ~]# echo ${wan[@]}
33 44 55 66
[root@promote ~]# echo ${wan[*]}
33 44 55 66
方法3:数组元素之间使用空格隔开
基本格式
列表名=“value0 value1 value2”
数组名=($列表名)
[root@localhost ~]# list="11 22 33 44 "
[root@localhost ~]# num=($list )
[root@localhost ~]# echo ${num[*] }
11 22 33 44
方法4:
基本格式
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
例如
AAA[0]=“11”
AAA[1]=“22”
AAA[2]=“33”
...
替换数组元素
[root@localhost ~]# zhang=( 11 22 33 44 55 66 )
[root@localhost ~]# echo ${zhang[*]}
11 22 33 44 55 66
[root@localhost ~]# zhang[1]=88
[root@localhost ~]# echo ${zhang[*]}
11 88 33 44 55 66
数组包括的数据类型与数组操作
数组只可存放数值或字符
下标从0开始
数组操作
获取数组长度
[root@localhost ~]# A=( a b c d e)
[root@localhost ~]# echo ${A[*] }
a b c d e
[root@localhost ~]# echo ${#A[*] }
5
举例(快速创建数组、奇数数组)
列出1-100的数,并将1-100和1-100的奇数定义为数组
!/bin/bashfor ((i=1;i<=99;i++));doarr[$i]=$i
done
echo
echo ${arr[*]}
[root@localhost ~]# sh 49.txt.sh
1 2 3 4 5 6 7 8 9 10 11 12 13
快速创建一个数组,元素由用户自己定义
#!/bin/bash
i=0
while true
doread -p "是否存入元素(yes/no) " doingif [ $doing == "no" ];thenbreakfiread -p "请存入第$[$i+i]个元素 :" keyarr[$i]=$keylet i++done
echo ${arr[*]}
~
[root@localhost ~]# sh 57.txt.sh
是否存入元素(yes/no) yes
请存入第0个元素 :10
是否存入元素(yes/no) yes
请存入第2个元素 :20
是否存入元素(yes/no) yes
请存入第4个元素 :30
是否存入元素(yes/no) yes
请存入第6个元素 :40
是否存入元素(yes/no) no
10 20 30 40
让70 56 45 90 80 分没到60的变成60
#!/bin/bash
zhang=(70 56 45 90 80 )for ((i=0;i<${#zhang[*]};i++));do
if [ ${zhang[$i]} -lt 60 ];thennew[$i]=60
elsenew[$i]=${zhang[$i]}
fi
done
echo ${new[*]}
[root@192 ~]# sh acsd.txt
70 60 60 90 80
#遍历数组,对未满60的元素直接删除
[root@localhost opt]# vim arr4.sh
#!/bin/bash
score=(12 90 80 99 43 60 90 4 5 7 8 4 3 4)
i=0
for f in ${score[*]}
doif [ $f -lt 60 ];thenunset score[$i]filet i++
done
echo ${score[*]}
[root@localhost opt]# sh arr4.sh
90 80 99 60 90
冒泡排序法
示意图
外层是轮内层是次
然后要交换两个瓶子中的水,必须找一个空瓶子作为媒介,根据一定的条件就可以换过来。
步骤过程
对比 前面下标 大于 后面下标 要放到后面
小的下标 赋予空瓶子
小的下标空了,把大的赋予小的
大的空了 瓶子里的小下标赋予到大的里面
[root@localhost opt]# vim arr3.sh
#!/bin/bash
#快速创建一个数组
for ((i=0;i>=0;i++))
doread -p "请输入你需要定义数组元素:" num
#如果输入空字符,那么退出本次循环if [ -z $num ];thenbreak
#否则把输入的数字赋值给数组元素elsearr[$i]=$numfi
done
echo "你的数组是:${arr[*]}"#定义数组前一个元素
for ((i=0;i<${#arr[*]};i++))
do#定义数组后一个元素for ((a=$i+1;a<${#arr[*]};a++))do
#条件判断,如果前一个元素大于后一个元素,就交换位置,否则下一次循环if [ ${arr[$i]} -gt ${arr[$a]} ];then
#交换位置temp=${arr[$i]}arr[$i]=${arr[$a]}arr[$a]=$temp
#fidone
done
echo "你的数组升序排列为:${arr[*]}"
[root@localhost opt]# sh arr3.sh
请输入你需要定义数组元素:45
请输入你需要定义数组元素:1
请输入你需要定义数组元素:32
请输入你需要定义数组元素:55
请输入你需要定义数组元素:4
请输入你需要定义数组元素:
你的数组是:45 1 32 55 4
你的数组升序排列为:1 4 32 45 55
调试命令
set命令
set -x:开启调节模式
set +x:关闭调节模式
[root@localhost opt]# vim arr4.sh #!/bin/bash #遍历数组,对未满60的元素直接删除 score=(12 90 43 60 90 4 4) i=0 for f in ${score[*]} do set -xif [ $f -lt 60 ];thenunset score[$i]fi set +xlet i++ done echo ${score[*]} [root@localhost opt]# sh arr4.sh + '[' 12 -lt 60 ']' + unset 'score[0]' + set +x + '[' 90 -lt 60 ']' + set +x + '[' 43 -lt 60 ']' + unset 'score[2]' + set +x + '[' 60 -lt 60 ']' + set +x + '[' 90 -lt 60 ']' + set +x + '[' 4 -lt 60 ']' + unset 'score[5]' + set +x + '[' 4 -lt 60 ']' + unset 'score[6]' + set +x90 60 90
bash/sh
选项:
-n:显示脚本错误
-v:显示脚本信息
-x:表示跟踪脚本
[root@localhost opt]# sh -x arr1.sh
arr1.sh:行5: 未预期的符号 `arr1[$i]=$[$i+1]' 附近有语法错误
arr1.sh:行5: `arr1[$i]=$[$i+1]'
shell函数与数组(了解函数,递归函数运用,了解数组,创建基数和偶数数组,冒泡排序,调试命令)相关推荐
- linux脚本case语句,shell中的case语句,数组及函数
case示例 ---------------------------------------------------------------------- .. echo "case&quo ...
- shell 使用数组作为函数参数的方法
使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内. #!/bin/bashfunction showArr(){arr=$1for ...
- 函数类型:有参函数、无参函数、匿名函数、回调函数、立即执行函数、闭包函数、递归函数...
1.有参函数:函数定义时,带有参数的函数 设置函数参数的默认值: (1)直接在函数定义位置的小括号内进行赋值 (2)低版本默认值的处理(在函数内部判断该参数是否有默认值,若没有,赋值初始值) 第1种默 ...
- Spark 第三讲 Scala数组与函数基础
一. 常见数据类型 Byte 8位有符号补码整数.数值区间为 -128 到 127 Short 16位有符号补码整数.数值区间为 -32768 到 32767 Int 32位有符号补码整数.数值区间为 ...
- 第六周:数组 + 递归 + 函数
目录 1.汉诺塔 题目: 代码: 2.阿克曼 题目: 代码: 3.回文数 题目: 代码: 4.为素数的因数 题目: 代码: 5.分数序列和 题目: 代码: 6.星期几 题目: 代码: 7.特殊求和 题 ...
- shell 脚本编程 五:函数
一.函数定义 有两种格式可以用来在 bash shell 脚本中创建函数. 第一种格式采用关键字 function,后跟分配给该代码块的函数名. function name { commands } ...
- 【C】C语言函数(包括:函数编写位置、数组作函数实参)
函数概述 函数的分类 函数是C语言程序基本的组成单位,每个程序有且只能有一个主函数(main()),其他的函数都是子函数.按照不同的额分类标准,函数可以分成不同的类: 函数从是否有返回值,可以将函数分 ...
- 分割成数组php字符串函数,PHP 分割字符串函数把字符串分割成数组示例
这篇文章主要为大家详细介绍了PHP 分割字符串函数把字符串分割成数组示例,具有一定的参考价值,可以用来参考一下. 对PHP分割字符串函数把字符串分割成数组感兴趣的小伙伴,下面一起跟随512笔记的小编两 ...
- JavaScript二维数组与函数
目录 一.二维数组 1.创建方式 2.访问二维数组元素 3.练习 (1)求3*4的二维数组的每行元素之和 (2)求3*4的二维数组的每列元素之和 (3)求3*3的二维数组的对角线元素之和 4.二维数组 ...
最新文章
- 用不惯VMware?试试这款更轻量级的虚拟机!
- 豆瓣评分 8.6,近 5 万读者学习的 Android 经典最新版出版,承载无数程序员的回忆......
- create-react-app搭建环境+Less+element+router+flux状态管理
- 【学术相关】刚刚,中科院最新预警期刊名单发布!
- 数据库升级后,准备使用原有数据文件启动数据库
- dbus-python指南
- linux pdf 编辑图层,PDF SDK DEMO
- 教你快速使用VSCode编写HTML文件
- 第二十次CCF CSP认证考试经验
- 实现发送Http请求的两种方法
- linux ping加网址,在运行里输入PING加网址是什么意思
- 432偏计算机编程,统计学考研432笔记
- overlayfs源代码解析
- FCKEDITOR编辑器的使用
- ORACLE日期函数浅谈
- 数据争用(data race) 和竞态条件(race condition)
- 中国网络安全企业50强(来源自安全牛公司)
- python密码爆破脚本_企业邮箱爆破小脚本(Python版)
- C++之路进阶——codevs2313(星际竞速)
- L1-044 稳赢 (15 分)
热门文章
- 深入Go的底层,带你走近一群有追求的人
- ubantu安装coturn穿透服务器
- 大牛书单 | 迎金秋,与腾讯技术大咖共读好书
- FATAL: NO bootable medium found! System halted
- MYSQL查表的字段名称,字段类型,字段长度,字段注释的SQL语句
- Spark2.3.0的DataFrame去哪了,DataSet是哪位?
- Linux下的查找命令
- JAVA程序设计----面向对象(上)
- leetcode 3. Longest Substring Without Repeating Characters | 3. 无重复字符的最长子串(双指针+滑窗)
- 【PAT甲级 BigDecimal科学计数法转换普通数字】1073 Scientific Notation (20 分) Java开挂解法 全部AC