shell函数与数组(了解函数,递归函数运用,了解数组,创建基数和偶数数组,冒泡排序,调试命令)

shell函数

了解函数

1、在编写shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,既可以成为函数

2、合理使用shell函数,可以使脚本更加简洁,增强程序的易读性,提高执行效率

函数定义

mark

  • return返回的是状态码,需要使用$?调取
  • echo 返回的是值,使用变量调用
函数
#!/bin/bash
function xue(){
 read -p "请输入第一个整数" na
 read -p "请输入第二个整数" nb
  name=$[$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 "请输入第一个整数" na
 read -p "请输入第二个整数" nb
  name=$[$na+$nb]
    echo $name
   return 100
}
[root@localhost ~]# vim .bashrc (局部声明)
[root@localhost ~]# source .bashrc (更新)
[root@192 ~]# xue
请输入第一个整数1
请输入第二个整数2
3


image-20200725220223001

递归函数

递归就是程序不断调用自身,递归方法就是方法直接或间接调用自身的方法。自己调用自己

举例子

列举出/var/log/下所有的文件,使用层次性输出。

#!/bin/bash
 function list_files(){
  for f in ` ls $i`
  do
  if [ -d "$1/$f" ];then
     echo "$2$f "
 list_files "$1/$f"" $2  "
   else
     echo "$2$f"
  fi
  done
}
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/bash
  for ((i=1;i<=99;i++));do
    arr[$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
do
  read -p "是否存入元素(yes/no) " doing
     if [ $doing == "no" ];then
       break
     fi
  read -p "请存入第$[$i+i]个元素 :" key
     arr[$i]=$key
    let 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 ];then
  new[$i]=60
else
  new[$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[*]}
do
  if [ $f -lt 60 ];then
    unset score[$i]
  fi
  let 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++))
do
  read -p "请输入你需要定义数组元素:" num
#如果输入空字符,那么退出本次循环
  if [ -z $num ];then
  break
#否则把输入的数字赋值给数组元素
  else
    arr[$i]=$num
  fi
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
#
  fi
  done
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 -x
      if [ $f -lt 60 ];then
        unset score[$i]
      fi
    set +x
      let 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 +x
      90 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]'

猜你喜欢

转载自blog.csdn.net/weixin_47151717/article/details/107586617
今日推荐