shell的函数和数组

一 shell函数

  1. Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。
  2. Shell 中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。
    Shell 函数定义的语法格式如下:
function name() {      #function是shell中的关键字,专门用来定义函数  name是函数名
  statements           #statements是函数要执行的代码,也就是一组语句;
  [return value]       #return value表示函数的返回值,其中return是shell关键字,专门用在函数中返回一个值。
}                      #由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的命令
1.1 脚本实例
[root@localhost opt]#vim jia.sh
#!/bin/bash
sum () {
s=`expr 5 + 8`
echo $s
}
sum
[root@server1 ~]# sh a.sh 
13
sum () {
 return $(($1 + $2))
}
sum 3 4
echo $?
[root@server1 ~]# sh a.sh 
7
function sum(){
  #命令序列
  read -p "请输入第一个整数: " num1
  read -p "请输入第一个整数: " num2
  SUM=$[$num1+$num2]
  echo "和:$SUM"
}
sum
[root@server1 ~]# sh a.sh 
请输入第一个整数: 5
请输入第一个整数: 4
和:9
1.2 函数的作用范围
  • 函数在Shell脚本中仅在当前Shell环境中有效
  • ShelI脚本中变量默认全局有效,将变量限定在函数内部使用local命令
  1. 示例
    函数内部变量通过local来实现
    通过定义myfun函数,在其内部设置局部变量i
    函数内部和外部分别赋值,进行结果验证
function sh(){
  #命令序列
  read -p "请输入第一个整数: " num1
  read -p "请输入第一个整数: " num2
  s=$[$num1+$num2]
  jerry=20
  echo 函数内$jerry
  echo 和:$s
}
sh
  echo 函数外$jerry
[root@server1 ~]# sh a.sh 
请输入第一个整数: 2
请输入第一个整数: 3
函数内20
和:5
函数外20
  1. local定义全局变量
function sh(){
  #命令序列
  read -p "请输入第一个整数: " num1
  read -p "请输入第一个整数: " num2
  s=$[$num1+$num2]
  local jerry=20     #local定义全局变量
  echo 函数内$jerry
  echo 和:$s
}
sh
  echo 函数外$jerry
[root@server1 ~]# sh a.sh 
请输入第一个整数: 2
请输入第一个整数: 4
函数内20
和:6
函数外
1.3:递归函数

调用自己本身的函数

示例
递归遍历目录
通过定义递归函数list_files来实现

#!/bin/bash
function list_files(){
 for s in `ls $1`
 do
 if [ -d "$1/$s" ]
  then
     echo "$2$s"
     list_files "$1/$s" "$2"
   else
     echo "$2$s"
   fi
   done
}
list_files "/var/log"
#$1表示/var/log
#$s表示/var/log下一个目录
#$2表示指定格式 子目录一定要做一个首行缩进
[root@server1 ~]# 11 bianli.sh
amanda
anaconda
anaconda.log
ifcfg.log
journal.log
ks-script-j10KNj.log
ks-script-mW8ioG.log
packaging.log
program.log

二 shell数组

2.1 应用场景包括
  1. 应用场景包长度
  2. 获取数组长度
  3. 获取元素长度
  4. 遍历元素
  5. 元素切片
  6. 元素替换
  7. 元素删除
2.2 数组的描述
  1. 数组:放着相同类型的数据集合
    应用场景比较多:列如班级人的成绩跟名字
    [11,22,33,44] 在内存中开辟了连续的空间
    ​ 配合循环使用
  2. 数组名称arr arr=(44,33,22,11)
    数组元素: 44 33 22 11 都是
    数组的长度: arr有4 个元素
for 临时标量 in 数组
do
done
2.3 数组定义方法
  1. 方法一
数组名=(shuai0 shuai1 shuai2...)
  1. 方法二
数组名=[0]=shuai [1]=shuai [3]=shuai...[root@server1 test]# num=([0]=44 [1]=33 [2]=22 [3]=11)
[root@server1 test]# echo ${num[*]}
44 33 22 11
  1. 方法三
列表名="shuai0 shuai1 shuai2.."
数组名= ($列表名)
[root@server1 test]# tom=" 1 2 3 4 "
[root@server1 test]# num=($tom)
[root@server1 test]# echo ${num[*]}
1 2 3 4
  1. 脚本
#!/bin/bash
list=`cat test.txt`
echo $list
[root@server1 test]# sh test.sh
5 6 7 8
#!/bin/bash
list=`cat test.txt`
f=($list)
echo ${f[*]}
[root@server1 test]# sh test.sh
5 6 7 8
  1. 方法四
    往往做的是替换 替换某一个元素
[root@server1 test]# num=([0]=2 [1]=5 [2]=6 [3]=8)
[root@server1 test]# echo ${num[*]}
2 5 6 8
[root@server1 test]# num[2]=10
[root@server1 test]# echo ${num[*]}
2 5 10 8
2.3.1:到100数组
[root@localhost ~]# vim ou.sh

#!/bin/bash
for ((i=0;i<99;i++))
 do
 tom[$i]=$[$i+1]
 done
echo ${tom[*]}

输出结果

[root@localhost ~]# bash ou.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
2.3.2:创建1到100奇数组
  1. 方法一
#!/bin/bash
k=0
j=1
for ((i=0;i<=100;i++));do
 k=$[ $i + $j ]
 let j++
  if [ $k -le 100 ];then
    tom[$i]=$k
  fi
done
echo ${tom[@]}
  1. 方法二
#!/bin/bash
for ((i=0;i<99;i++))
 do
 tom[$i]=$[$i+1]
 done
echo ${tom[*]}
2.3.3 创建任意数字及长度,根据需求加入元素
#!/bin/bash
i=0
while true
do
  read -p "是否输入元素(yes/no):" e
  if [ $e == "no" ];then
  break
  fi
  read -p "请输入第$[$i+1]个元素:" f
  tom[$i]=$f
  let i++
done
echo ${tom[@]}
[root@localhost ~]# bash ou.sh
是否输入元素(yes/no):y
请输入第1个元素:7
是否输入元素(yes/no):6
请输入第2个元素:6
是否输入元素(yes/no):y
请输入第3个元素:1
是否输入元素(yes/no):
2.4.1 获取数组长度和下标赋值
[root@localhost ~]# tt=(33 44 55)
[root@localhost ~]# echo ${tt[@]}
33 44 55
[root@localhost ~]# echo ${tt[1]}
44
2.4.2 下面一组值,不满90加到100
[root@localhost ~]# vim shell.sh
#!/bin/bash
num=(11 22 33 44 55 66)
#遍历 
for ((i=0;i<${#num[*]};i++))
  do
  if [ ${num[$i]} -lt 80 ];then
    new[$i]=100
  else
    new[$i]=${num[$i]}
  fi
done
echo ${new[*]}
[root@localhost ~]# sh shell.sh
100 100 100 100 100 100                   
2.4.3 求数组的最大数字
#!/bin/bash
num=(12 13 14 15 16)
tom=0
for ((i=0;i<${#num[*]};i++))
   do
  if [ ${num[$i]} -gt $tom ];then
   tom=${num[$i]}
 fi
done
echo $tom
[root@localhost ~]# sh shell.sh
16
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值