shell——函数与数组与shell脚本调试

函数与数组

  • 一、shell函数
    • shell函数定义
    • 调用函数的方法
    • 特殊$符号意思
    • 实验
      • 1、两个数字求和
    • 函数的作用范围
    • 函数的参数
    • 递归函数
    • 实验
      • Shell脚本计算10的阶乘10!代码如下:
      • 递归遍历目录
  • 二、数组
    • 数组定义方法
    • 数组操作
      • 1、获取数组长度
      • 2、获取某下标赋值
      • 3、数组遍历
      • 4、数组切片
      • 5、数组替换
      • 6、数组删除
  • 三、shell脚本调试
  • 四、实验
      • 1、创建存放1-100奇数的数组
      • 2、写出1-100的数
      • 3、创建任意数字及长度的数组,根据客户的需求加入元素
      • 4、把数组里面小于60的数全赋值60
      • 5、输出最大值
  • 排序算法——冒泡排序
    • 将数组中的数按照从大到小的顺序排列
    • 将任意个数按照从打到小的顺序排列

一、shell函数

  • 将命令序列按照格式写在一起
  • 可方便重复使用命令序列

shell函数定义

[ function ] 函数名(){
    命令序列
    [return x]
}

调用函数的方法

函数名 [参数1] [参数2]

特殊$符号意思

$0:是脚本本身的名字;
$#:是传给脚本的参数个数;
$@:是传给脚本的所有参数的列表,即被扩展为"$1" “$2” “$3"等;
$*:是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,即被扩展成”$1c$2c$3",其中c是IFS的第一个字符;
$$:是脚本运行的当前进程ID号;
$?:是显示最后命令的退出状态,0表示没有错误,其他表示有错误;

实验

1、两个数字求和

通过sum(){}定义函数
使用read命令交互输入两个数并求和

#!/bin/bash
function sum(){
    #命令序列
    read -p "请输入第一个整数:" num1
    read -p "请输入第二个整数:" num2
    SUM=$[$sum1+$sum2]
    echo "和:$SUM"
    #echo返回的是处理结果
    echo $SUM
    #return返回的是状态码
    return 100
}
number=`sum`
echo $?
echo $number

shell——函数与数组与shell脚本调试_第1张图片

echo返回的时处理结果值return返回的时状态码,调用函数时,若有返回值,通过$?来获取
调用要用命令形式得加反撇号``

函数的作用范围

函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
局部变量,定义在函数中,只在函数内识别,函数外不识别
例:
函数内部变量通过local来实现
shell——函数与数组与shell脚本调试_第2张图片

函数的参数

参数的用法
函数名称 参数1 参数2 参数3…
参数的表示方法
$1 $2 3......... 3......... 3.........{10} ${11}…

递归函数

调用自己本身的函数

function sum(){
    s=`sum`
}

本质:
从什么时候开始
到什么时候结束
每次递归需要干嘛

实验

Shell脚本计算10的阶乘10!代码如下:

#!/bin/sh
factorial=1 
for a in `seq 1 10  `
do
factorial=`expr $factorial\*$a`
done
echo "10! = $factorial"

递归遍历目录

function list_files(){
    for f in `ls $1`
    do
    #判断是否为目录
    if [ -d "$1/$f" ];then
        echo "$2$f"
        #递归调用
        list_files "$1/$f" "   $2"
    else 
        echo "$2$f"
    fi
    done
}
list_files "/var/log" ""

二、数组

相同类型数据的集合
[11,22,33,44]在内存红开辟了连续的空间,配合循环使用
数组名称:arr arr=(11,22,33,44)
数组元素:11
数组长度:4
数组下标:0,1,2,3 (索引 计算机索引基本上都是从0开始)
for 临时变量 in 数组
do
done

数组定义方法

方法一
数组名=(value1 value2 value3…)
在这里插入图片描述在这里插入图片描述
方法二
数组名=([0]value [1]value [2]value…)
shell——函数与数组与shell脚本调试_第3张图片
方法三
列表名=“value0 value1 value2…”
数组名=($列表名)
此方法不可以调用单个数据
在这里插入图片描述
方法四
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
可以替换掉其中的某个元素shell——函数与数组与shell脚本调试_第4张图片

数组操作

1、获取数组长度

${数组名[@/*]}

2、获取某下标赋值

${数组名[下表]}

3、数组遍历

for v in $(arr[@])
do
echo $v
done

4、数组切片

${数组名[@/*]:起始位置:长度}
shell——函数与数组与shell脚本调试_第5张图片

5、数组替换

${数组名[@/*]/查找字符/替换字符}
shell——函数与数组与shell脚本调试_第6张图片

6、数组删除

unset
shell——函数与数组与shell脚本调试_第7张图片

三、shell脚本调试

echo命令
bash命令
命令语法
sh [-nvx] 脚本名
常用选项
-n不执行
-v执行
-x关闭
set命令
set -x :开启调解模式
set +x:关闭调节模式
shell——函数与数组与shell脚本调试_第8张图片

四、实验

1、创建存放1-100奇数的数组

#!/bin/bash
k=0    #元素
j=1    #增量
for ((i=0;i<=99;i++));do
    k=$[$i+$j]
    let j++
    #最大元素不能操作100
    if[ $k -le 100 ];then
       arr[$i]=$k
    fi
done
echo ${arr[*]}
#!/bin/bash
for ((i=0;i<=49;i++));so
    arr[$i]=$[2*$i+1]
done
echo ${arr[*]}

2、写出1-100的数

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

3、创建任意数字及长度的数组,根据客户的需求加入元素

#!/bin/bash
i=0   #数组下标
while true    //死循环
do
    read -p "是否存入元素(yes/no):" doing
    if [ $doing == "no" ];then
        break
    fi
    read -p "请存入第$[$i+1]个元素:" key
    arr[$i]=$key
    let i++
done
echo ${arr[*]}
#!/bin/bash
for ((i=0;;i++));do
    read -p "加入元素:" num
    if [ -z $num ];then     //-z 判断字符串长度是否为0
        break
    fi
    arr[$i]=$[$num]
done
echo ${arr[*]}

4、把数组里面小于60的数全赋值60

#!/bin/bash
#原始数组
score=(72 88 42 55 90)
#遍历数组
for ((i=0;i<${#score[*];i++}));do
    #判断是否大于60,未满足60直接赋予60
    if [ ${score[$i]} -lt 60 ];then
        new[$i]=60
    else
        new[$i]=${score[$i]}
    fi
done
echo ${new[*]}

5、输出最大值

#!/bin/bash
score=(45 88 67 90 78)
temp=0
for ((i=0;i<${#score[*]};i++));do
    if [ ${score[$i]} -gt $temp ];then
        temp=${score[$i]}
    fi
done
echo $temp

在这里插入图片描述

排序算法——冒泡排序

将数组中的数按照从大到小的顺序排列

#!/bin/bash
score=(45 88 67 90 78)
#外层为轮
for ((i=1;i<${#score[*]};i++));do
    #内层为次
    for ((j=0;j<${#score[*]}-i;j++));do
    #两数交换
       if [ ${score[$j]} -gt ${score[`expr $j + 1`]} ];then
           tmp=${score[`expr $j + 1`]}
           score[`expr $j + 1`]=${score[$j]}
           ${score[$j]}=tmp
       fi
    done
done
echo ${score[*]}

将任意个数按照从打到小的顺序排列

#!/bin/bash
#存入元素
k=0
while true
do
    read -p "是否存入元素:" doing
    if [ $doing == "no" ];then
        break
    fi
    read -p "请输入第$[$k+1]个元素:" key
    score[$k]=$key
    let k++
done
#外层为轮
for ((i=1;i<${#score[*]};i++));do
    #内层为次
     for ((j=0;j<${#score[*]}-i;j++));do
     #两数交换
      if [ ${score[$j]} -gt ${score[((j+1))]} ];then
           tmp=${score[((j+1))]}
           score[((j+1))]=${score[$j]}
           ${score[$j]}=tmp
       fi
     done
done
echo ${score[*]}
    

你可能感兴趣的:(shell脚本)