文章目录

  • 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数组

数组就是把有限个元素变量或数组用一个名字命名,然后用编号区分他们的变量的集合。这个名字成为数组名,编号成为数组下标。组成数组的各个变量成为数组的分量,也称为数组的元素,有时也称为下标变量。

  1. 获取数组长度
  2. 使用for循环获取具体信息,使用下标或索引标记数组中数据的位置
  3. 可以存放多种数据,如:整型,长整形,浮点型(单精度,双精度),字符串等
  4. 获取元素长度
  5. 遍历元素
  6. 元素切片
  7. 元素替换
  8. 元素删除
  9. 数组下标从0开始算
  10. 数组长度从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函数与数组(了解函数,递归函数运用,了解数组,创建基数和偶数数组,冒泡排序,调试命令)相关推荐

  1. linux脚本case语句,shell中的case语句,数组及函数

    case示例 ---------------------------------------------------------------------- .. echo "case&quo ...

  2. shell 使用数组作为函数参数的方法

    使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内. #!/bin/bashfunction showArr(){arr=$1for ...

  3. 函数类型:有参函数、无参函数、匿名函数、回调函数、立即执行函数、闭包函数、递归函数...

    1.有参函数:函数定义时,带有参数的函数 设置函数参数的默认值: (1)直接在函数定义位置的小括号内进行赋值 (2)低版本默认值的处理(在函数内部判断该参数是否有默认值,若没有,赋值初始值) 第1种默 ...

  4. Spark 第三讲 Scala数组与函数基础

    一. 常见数据类型 Byte 8位有符号补码整数.数值区间为 -128 到 127 Short 16位有符号补码整数.数值区间为 -32768 到 32767 Int 32位有符号补码整数.数值区间为 ...

  5. 第六周:数组 + 递归 + 函数

    目录 1.汉诺塔 题目: 代码: 2.阿克曼 题目: 代码: 3.回文数 题目: 代码: 4.为素数的因数 题目: 代码: 5.分数序列和 题目: 代码: 6.星期几 题目: 代码: 7.特殊求和 题 ...

  6. shell 脚本编程 五:函数

    一.函数定义 有两种格式可以用来在 bash shell 脚本中创建函数. 第一种格式采用关键字 function,后跟分配给该代码块的函数名. function name { commands } ...

  7. 【C】C语言函数(包括:函数编写位置、数组作函数实参)

    函数概述 函数的分类 函数是C语言程序基本的组成单位,每个程序有且只能有一个主函数(main()),其他的函数都是子函数.按照不同的额分类标准,函数可以分成不同的类: 函数从是否有返回值,可以将函数分 ...

  8. 分割成数组php字符串函数,PHP 分割字符串函数把字符串分割成数组示例

    这篇文章主要为大家详细介绍了PHP 分割字符串函数把字符串分割成数组示例,具有一定的参考价值,可以用来参考一下. 对PHP分割字符串函数把字符串分割成数组感兴趣的小伙伴,下面一起跟随512笔记的小编两 ...

  9. JavaScript二维数组与函数

    目录 一.二维数组 1.创建方式 2.访问二维数组元素 3.练习 (1)求3*4的二维数组的每行元素之和 (2)求3*4的二维数组的每列元素之和 (3)求3*3的二维数组的对角线元素之和 4.二维数组 ...

最新文章

  1. 用不惯VMware?试试这款更轻量级的虚拟机!
  2. 豆瓣评分 8.6,近 5 万读者学习的 Android 经典最新版出版,承载无数程序员的回忆......
  3. create-react-app搭建环境+Less+element+router+flux状态管理
  4. 【学术相关】刚刚,中科院最新预警期刊名单发布!
  5. 数据库升级后,准备使用原有数据文件启动数据库
  6. dbus-python指南
  7. linux pdf 编辑图层,PDF SDK DEMO
  8. 教你快速使用VSCode编写HTML文件
  9. 第二十次CCF CSP认证考试经验
  10. 实现发送Http请求的两种方法
  11. linux ping加网址,在运行里输入PING加网址是什么意思
  12. 432偏计算机编程,统计学考研432笔记
  13. overlayfs源代码解析
  14. FCKEDITOR编辑器的使用
  15. ORACLE日期函数浅谈
  16. 数据争用(data race) 和竞态条件(race condition)
  17. 中国网络安全企业50强(来源自安全牛公司)
  18. python密码爆破脚本_企业邮箱爆破小脚本(Python版)
  19. C++之路进阶——codevs2313(星际竞速)
  20. L1-044 稳赢 (15 分)

热门文章

  1. 深入Go的底层,带你走近一群有追求的人
  2. ubantu安装coturn穿透服务器
  3. 大牛书单 | 迎金秋,与腾讯技术大咖共读好书
  4. FATAL: NO bootable medium found! System halted
  5. MYSQL查表的字段名称,字段类型,字段长度,字段注释的SQL语句
  6. Spark2.3.0的DataFrame去哪了,DataSet是哪位?
  7. Linux下的查找命令
  8. JAVA程序设计----面向对象(上)
  9. leetcode 3. Longest Substring Without Repeating Characters | 3. 无重复字符的最长子串(双指针+滑窗)
  10. 【PAT甲级 BigDecimal科学计数法转换普通数字】1073 Scientific Notation (20 分) Java开挂解法 全部AC