Shell脚本 函数应用与数组介绍及大小排序、脚本调试及数组切片

一、Shell函数应用

  • 如果有一些命令序列是现需要反复调用执行的,若每次都用同一命令重复写一遍,会导致代码量比较大。Shell函数可以将命令序列按格式写在一起,以便可以重读使用。
  • Shell格式里 其中function是可选的,表示函数的功能,这个是可以省略掉的;函数名后面加一个(),里面是没有内容的。执行的命令放在{}里面,return x 的作用是当命令执行完给一个返回值,return后跟数值n(0-255),可省略。
function 函数名(){
    
    
  命令序列
  [return x]
  }

1.1 调用函数的方法

  • 函数名 [参数1($1)] [参数2($2)]
  • 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
  • 10不能获取第十个参数,获取第十个参数需要10 不能获取第十个参数,获取第十个参数需要10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。

#! /bin/bash
# 求和函数体
function  sum(){
    
    
# 命令序列
  read -p "请输入第一个整数: "  num1
  read -p "请输入第二个整数: "  num2
        SUM=$[$num1+$num2]
        #echo 返回的是处理结果值
        echo $SUM
        # return返回给系统一个值
        return 100
}
sum  ## 表示调用函数 这次不需要添加参数,所以后面没有跟
echo $? ## 输出 return返回的值

1.2 把函数放到环境变量直接调用函数

  • 步骤
函数放到环境变量直接调用  
~/.bashrc    ## 用户环境变量
/etc/profile## 系统环境变量
~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.
/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
source   ~/.bashrc  ## 重新加载生效
[root@promote ~]# vim ~/.bashrc 
### 在末尾添加
function  sum(){
    
    
# 命令序列
  read -p "请输入第一个整数: "  num1
  read -p "请输入第二个整数: "  num2
        SUM=$[$num1+$num2]
        #echo 返回的是处理结果值
       echo "输入的两个数和为:$SUM"
        # return返回的是状态码
        return 100
}
[root@promote ~]# source   ~/.bashrc
-bash: /root: 是一个目录
[root@promote ~]# sum  ## 直接调用函数sum  但是切换用户后就不能调用,因为刚刚修改的文件时用户环境变量
请输入第一个整数: 10
请输入第二个整数: 20
输入的两个数和为:30    

1.3递归函数

  • 调用自己本身的函数,即自己调用自己。

1.3.1查看/var/log 目录下所有的文件和子目录。

#! /bin/bash
function list(){
    
    
 for f in `ls $1`     ## 遍历/var/log下的文件和目录
do
if [ -d "$1/$f" ]       ## 如果 为目录
then
 echo "$2$f"   ## 输出路径  前面空一个空格
 list  "$1/$f"  " $2"      ## 继续调用list函数  遍历子目录下的文件和目录
 else          ## 如果不是目录
       echo "$2$f"    ## 则输出文件路径,空一个空格
fi
done
}
list "/var/log" ""

二、Shell数组

  • 数组 : 往往放着相同数据类型的集合,叫做数组,往往配合循环使用.
  • 应用场景: 获取数组长度、获取元素长度、遍历元素、元素切片、元素替换、元素删除。
 数组名称  arr=(11,22,33,44)        arr是数组名称
 数组元素(11 22 等都是其中一个元素)
 数组的长度(元素的个数,从1开始数 上面的数组长度为4  数组长度获取 echo  $#{num[*]})
 数组下标:调用数组中某一个元素   (数组下标  0  1   2   3    索引,基本都是从0开始)

2.1 定义数组的方法

方法一:数组名=(value 0  value1   value2)        ## 调用方法  echo  ${num[*]}
方法二:数组名=[0]=55 [1]=66 [2]=77 [3]=88)  调用方法 echo ${num[@]}或者echo ${num[*]}
方法三:数组名= “value 0  value1   value2”  list="11 12 13 14"   num=($list)  echo ${num[*]}  ## 先定义列表,再赋值给数组
方法四:(主要用来做替换的)
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"

2.2 调用数组的方法

echo  ${num[*]}  ## 但凡看到中括号,用的就是数组

2.3 数组长度获取

echo  $#{num[*]}

2.4 数组遍历

for v  in    echo  ${num[*]}
>do
>  echo $v

2.5 数组脚本句子示例

2.5.1把数组中的数字按小到大排列 – 冒泡法

#!/bin/bash
a=(55 66 11 33 99)
k=${#a[*]}
for ((i=1;i<=$k;i++))
 do
    temp=1
   for ((j=1;j<=$[$k-$i];j++))
        do
             if [ ${a[$j]} -lt  ${a[$j-1]} ]
           then
            tem=${a[$j]}
            a[$j]=${a[$j-1]}
            a[$j-1]=$tem
            temp=0
           fi
     done
      if [ $temp -eq 1 ]
       then
         break
       fi

done
echo ${a[*]}
~          

2.5.2把数组中的数字按小到大排列 – 插入法

#!/bin/bash
a=(98 23 45 67 7 8 99 100)
k=${#a[*]}
for ((i=1;i<$k-1;i++))
 do
   if [ ${a[$i]} -lt ${a[$i-1]} ]
   then
       temp=${a[$i]}
      for ((j=$i-1;j>=0;j--))
      do
        if [ ${a[$j]} -gt $temp ]
       then
            a[$j+1]=${a[$j]}
        else
           break
        fi
      done
       a[$j+1]=$temp
   fi
done
echo ${a[*]}                                                                                                                                      
~                                                                                                                                   
~                

2.5.3把数组中的数字按大到小排列

#!/bin/bash
a=(98 23 45 67 7 8 99)
k=${#a[*]}
for (( i=1;i<$k;i++ ))
 do
   if [ ${a[$i]} -gt ${a[$i-1]} ]
     then
      let temp=${a[$i]}
        for (( j=$i-1; j>=0;j--))
          do
           if [ ${a[j]} -lt $temp ]
           then
           let a[$j+1]=a[$j]
           else
            break
           fi
           done
        let a[$j+1]=$temp
fi
done
echo ${a[*]}
~                                                                                                                                   
~                

2.5.3 讲数组中小于60的数字全部去掉

!/bin/bash
a=(10 60 70 80 90 10 50 55 49 88 35 89 56 77)
i=0
k=${#a[*]}
for ((i=0;i<$k;i++))
do
  if [ ${a[$i]} -lt 60 ];then
        unset a[$i]
   fi
done
echo ${a[*]}
~          

三、脚本调试

3.1 bash命令

  • 基本格式
    sh [-nvx] 脚本名
-n   不执行,仅检查语法有无问题,语法无误便不会显示任何内容
-x    将执行的脚本内容输出到屏幕上
-v    在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示

3.2 set命令

set -x 关闭调节 ## 在程序中输入
set +x 开启调节模式

四、数组切片

4.1 数组切片

 数组切片   ${数组名[@]:起始位置:长度}或者${
    
    数组名[*]:起始位置:长度  
(起始位置(索引下标 从0开始,为数组长度   包括开始那个数)
[root@localhost opt]# a=(1 2 3 4 5 6 7 8 9)
[root@localhost opt]# echo ${a[@]:0:5}
1 2 3 4 5

4.2 数组替换

${数组名[@]/查找字符/替换字符}或者${
    
    数组名[*]/查找字符/替换字符    
(不会更改原有数组当中的值,只在缓存的副本中修改,原有的不会变)
[root@localhost opt]# a=(1 2 3 4 5 6 7 8 9)
[root@localhost opt]# echo ${a[@]/1/5}
5 2 3 4 5 6 7 8 9
[root@localhost opt]# echo ${a[@]}
1 2 3 4 5 6 7 8 9
  • 要想修改数组,重写或者覆盖
 [root@localhost opt]#  a=(${a[@]/4/66})
[root@localhost opt]# echo ${a[@]}
1 2 3 66 5 6 7 8 9

4.3 删除

  • 删除数组中单个元素
    unset a[3]
[root@localhost opt]# echo ${a[@]}
1 2 3 66 5 6 7 8 9
[root@localhost opt]# unset a[3]
[root@localhost opt]# echo ${a[@]}
1 2 3 5 6 7 8 9

  • 删除整个数组
删除整个数组:   unset  a
[root@localhost opt]# unset a
[root@localhost opt]# echo ${a[@]}


猜你喜欢

转载自blog.csdn.net/weixin_47219725/article/details/107532314
今日推荐