shell函数与数组的详解走起

一:shell函数

Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。

Shell 中的函数和C++JavaPythonC# 等其它编程语言中的函数类似,只是在语法细节有所差别。

Shell 函数定义的语法格式如下:

function name() {
  statements
  [return value]
}

对各个部分的说明:

  • function是 Shell 中的关键字,专门用来定义函数;
  • name是函数名;
  • statements是函数要执行的代码,也就是一组语句;
  • return value表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。
    { }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

1.1:函数定义的简化写法

如果你嫌麻烦,函数定义时也可以不写 function 关键字:

name() {
  statements
  [return value]
}

如果写了 function 关键字,也可以省略函数名后面的小括号:

function name {
  statements
  [return value]
}

我建议使用标准的写法,这样能够做到“见名知意”,一看就懂。

[root@localhost opt]#vim jia.sh
#!/bin/bash
sum(){
#命令序列
 s=`expr 2 + 2`
 echo $s
}
sum
~  
[root@localhost opt]# sh jia.sh
4
#!/bin/bash
sum(){
#命令序列
 s=`expr $1 + $2`
 echo $s
}
sum 2 3    

[root@localhost opt]# sh xia.sh 
5
#!/bin/bash
sum(){
#命令序列
# k=`expr $1 + $2`   #这里注释一下
# echo $k
 return $(($1 + $2))
}
sum 2 3
#res=$(sum 2 3)
echo $?
~   
[root@localhost opt]# sh xia.sh 
5return 返回的值调出来了
#!/bin/bash
sum(){
#命令序列
# k=`expr $1 + $2`
# echo $k
 echo $(($1 + $2))
}
#sum 2 3
res=$(sum 2 3)
echo $?,$res

[root@localhost opt]# sh xia.sh 
0,5
#!/bin/bash
sum(){
#命令序列
# k=`expr $1 + $2`
# echo $k
 return $(($1 + $2))       #把echo换成return
}
#sum 2 3
res=$(sum 2 3)
echo $?,$res
~  
[root@localhost opt]# sh xia.sh 
5,
#!/bin/bash
#求和函数体
function sum(){
  #命令序列
  read -p "请输入第一个整数: " num1
  read -p "请输入第一个整数: " num2
  SUM=$[$num1+$num2]
  echo "和:$SUM"
}

sum
[root@localhost opt]# sh 3.sh 
请输入第一个整数: 3
请输入第一个整数: 4
和:7
#!/bin/bash
#求和函数体
function sum(){
  #命令序列
  read -p "请输入第一个整数: " num1
  read -p "请输入第一个整数: " num2
  SUM=$[$num1+$num2]
  echo $SUM
  return 50
}
shuai=`sum`
echo $?
echo $shuai

[root@localhost opt]# sh 5.sh 
请输入第一个整数: 3
请输入第一个整数: 4
50
7
#!/bin/bash
#求和函数体
function sum(){
 #命令序列
 #read -p "请输入第一个整数: " num1
 #read -p "请输入第一个整数: " num2
 SUM=$[$1+$2]
 #echo 返回的是处理结果值
 echo $SUM
 #return返回的是状态码
 return 50
}
shuai=`sum 3 4`
let shuai+=1
echo $shuai

[root@localhost opt]# sh 6.sh 
8

1.2:函数的作用范围

  • 函数在Shell脚本中仅在当前Shell环境中有效
  • ShelI脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令
    示例
    ●函数内部变量通过local来实现
    ◆通过定义myfun函数,在其内部设置局部变量i
    ◆函数内部和外部分别赋值,进行结果验证
#!/bin/bash
function shu(){
  read -p "请输入第一个整数:" num1
  read -p "请输入第一个整数:" num2
  shuai=$[$num1+$num2]
  ai=50
  echo "函数内$ai"
  echo "和:$shuai"
}
shu
echo "函数外$ai"
[root@localhost opt]# sh 7.sh 
请输入第一个整数:3
请输入第一个整数:4
函数内50
和:7
函数外50

mark

[root@localhost opt]# sh 7.sh 
请输入第一个整数:3
请输入第一个整数:4
函数内50
和:7
函数外

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@localhost opt]# bash di.sh
anaconda
  anaconda.log
  ifcfg.log
  journal.log
  ks-script-SbAyfV.log
  packaging.log
  program.log
  storage.log
  syslog
  X.log
audit
....省略诶容

二:shell数组

2.1:应用场景包括

  • 应用场景包长度
  • 获取数组长度
  • 获取元素长度
  • 遍历元素
  • 元素切片
  • 元素替换
  • 元素删除

2.2:数组的描述

数组:放着相同类型的数据集合

应用场景比较多:列如班级人的成绩跟名字

[11,22,33,44] 在内存中开辟了连续的空间

​ 配合循环使用

数组名称arr arr=(11,22,33,44)

数组元素: 11 22 33 44都是

数组的长度: arr有4 个元素

数组下标:33元素的下面是2 (比如11下标是0 22下标是1)

for 临时标量 in 数组

do

done

2.3:数组定义方法

方法一

数组名=(shuai0 shuai1 shuai2...

示例

[root@localhost opt]# num=(11 22 33 44)        '定义数组 元素直接一定要有空格'
[root@localhost opt]# echo $num                '单独输出是输出不了全部元素的'
11
[root@localhost opt]# echo ${num[*]}            '*代表所有'
11 22 33 44
[root@localhost opt]# echo ${num[3]}            '把*换成第几个下标就是输出第几个元素'
44

方法二

数组名=[0]=shuai [1]=shuai [3]=shuai..)

示例

[root@localhost opt]# num=([0]=11 [1]=22 [2]=33 [3]=44)
[root@localhost opt]# echo ${num[@]}         '@作用跟*一样'
11 22 33 44
[root@localhost opt]# echo ${num[*]}
11 22 33 44

方法三

列表名="shuai0 shuai1 shuai2.."
数组名= ($列表名)

示例

[root@localhost opt]# shuai="12 13 14 15"
[root@localhost opt]# num=($shuai)
[root@localhost opt]# echo ${num[*]}
12 13 14 15
[root@localhost opt]# vim test.txt               '在test.txt文件写入数字'
[root@localhost opt]# cat test.txt                '查看一下'
11
22
33
44
55

[root@localhost opt]# vim test.sh
#!/bin/bash
list=`cat test.txt`
shuai=($list)
echo ${shuai[*]}

[root@localhost opt]# sh test.sh 
11 22 33 44 55      

方法三

往往做的是替换 替换某一个元素

数组名[0]="shuai"
数组名[1]="shuai"
数组名[2]="shuai"
[root@localhost opt]# echo ${num[*]}
12 13 14 15
[root@localhost opt]# num[1]=88
[root@localhost opt]# echo ${num[*]}
12 88 14 15

2.31:创建1到100数组

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

[root@localhost opt]# sh 5.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 100

2.32:创建1到100奇数组

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

[root@localhost opt]# sh 5.sh 
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99

1-100其中的奇数

下标 0 1 2 3 4 5 定义i

元素 1 3 5 7 9 11 定义k i + i+ j

增量 1 2 3 4 5 6 定义j

方法2

#!/bin/bash
#创建1-100奇数的数组
k=0  #定义元素
j=1  #定义增量
 for ((i=0;i<=100;i++));do
     k=$[$i+$j]
     let j++
     #最大元素不能超过100
        if [ $k -le 100 ];then
          shuai[$i]=$k
     fi
done
echo ${shuai[@]}

2.33:创建任意数字及长度,根据客户需求加入元素

#!/bin/bash
i=0
while true
do
 read -p "是否加入元素(yes/no):" dd
 if [ $dd == "no" ];then
  break
 fi
 read -p "请存入第$[$i+1]个元素:" tt
 shuai[$i]=$tt
 let i++
done
echo ${shuai[@]}

[root@localhost opt]# sh xx.sh 
是否加入元素(yes/no):yes
请存入第1个元素:23
是否加入元素(yes/no):yes
请存入第2个元素:45
是否加入元素(yes/no):yes
请存入第3个元素:56
是否加入元素(yes/no):no
23 45 56

2.4:数组操作

2.41:获取数组长度

[root@localhost opt]# abc=(11 22 33)
[root@localhost opt]# echo ${abc[*]}
11 22 33
[root@localhost opt]# echo ${abc[2]}
33:

2.42:读取某下标赋值

[root@localhost opt]# num=([0]=11 [1]=22 [2]=33 [3]=44)
[root@localhost opt]# echo ${num[0]}
11
[root@localhost opt]# echo ${num[2]}
33
[root@localhost opt]# echo ${num[3]}
44

2.43:下面一组值,不满60加到60

#!/bin/bash
#原始数据
num=(56 90 59 53 89)
#遍历数组
 for ((i=0;i<${#num[*]};i++));do
  #判断是否大于60,为满足60直接赋值60
  if [ ${num[$i]} -lt 60 ];then
    new[$i]=60
  else
    new[$i]=${num[$i]}
  fi
done
echo ${new[*]}

[root@localhost opt]# bash 60.sh 
60 90 60 60 89

2.44:求数组的最大值

#!/bin/bash
num=(89 96 35 73)
shuai=0
for ((i=0;i<${#num[*]};i++));do
 #比较大小,大的赋予给shuai
 if [ ${num[$i]} -gt $shuai ];then
        shuai=${num[$i]}
 fi
done
echo $shuai

[root@localhost opt]# sh 61.sh 
96

满60加到60

#!/bin/bash
#原始数据
num=(56 90 59 53 89)
#遍历数组
 for ((i=0;i<${#num[*]};i++));do
  #判断是否大于60,为满足60直接赋值60
  if [ ${num[$i]} -lt 60 ];then
    new[$i]=60
  else
    new[$i]=${num[$i]}
  fi
done
echo ${new[*]}

[root@localhost opt]# bash 60.sh 
60 90 60 60 89

2.44:求数组的最大值

#!/bin/bash
num=(89 96 35 73)
shuai=0
for ((i=0;i<${#num[*]};i++));do
 #比较大小,大的赋予给shuai
 if [ ${num[$i]} -gt $shuai ];then
        shuai=${num[$i]}
 fi
done
echo $shuai

[root@localhost opt]# sh 61.sh 
96

感谢观看,不知之处多多指教

猜你喜欢

转载自blog.csdn.net/weixin_47151643/article/details/107609337