- 一、函数
- 1.1 函数概念
- 1.2 函数的基本格式
- 1.3 函数的返回值
- 1.4 函数的作用范围
- 1.5 函数的用法
- 1.5.1 函数的参数
- 1.5.2 函数的常规调用方法
- 1.6 递归函数
- 二、数组
- 2.1数组的含义与作用
- 2.2 数组的分类
- 2.3 定义数组的方法
- 2.4 数组格式
- 2.5 对数组的相关调整
- 2.6 数组的一些运用示例
- 总结:
引言: 学习shell的标准化,模块化 一、函数 1.1 函数概念
将命令序列按格式写在一起
可方便重复使用命令序列
1.2 函数的基本格式[function] 函数名(){
命令序列
[return x] #使用return或exit可以显示的结束函数
}
或者
#也可以省略掉[function],它表示该函数的功能
函数名() { #函数名后面()是没有内容的
命令序列 #我们执行的命令内容放在{}里面
}
函数定义完之后并不会自动执行,需要调用才行
好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错
当然我们写函数最终目的还是为了调用,为了实现某个功能块。
1.3 函数的返回值return表示退出函数并返回一个退出值,脚本中可以用$? 变量显示该值使用原则
函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
退出状态码必须是0~255,超出时值将为256取余
1.4 函数的作用范围函数在shell脚本中仅在当前shell环境中有效
shell脚本中的变量默认全局有效
将变量限定在函数内部使用 :local 命令
示例:
[root@localhost hs]# sh 3.sh 6 6 [root@localhost hs]# vim 3.sh [root@localhost hs]# sh 3.sh 6 81.5 函数的用法 1.5.1 函数的参数
参数的用法 :
函数名称 参数1 参数2 参数3
参数的表示方法:
$1 $2 $3 …… ${10} ${11}……
1.5.2 函数的常规调用方法
与顺序无关,只有函数调用才能执行
遇到重名时只执行最后一个,函数调用从上往下执行
调用自己本身的函数
含义:
数组中可以存放多个值。
Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。
与大部分编程语言类似,数组元素的下标由 0 开始。
2.2 数组的分类数值类型的数组: 一对括号表示数组,数组中元素之间使用“空格”来隔开。
arr_number=(1 2 3 4 5);、
字符串类型数组: 同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。
arr_string=(“abc” “edf” “sss”); 或者 arr_string=(‘abc’ ‘edf’ ‘sss’);
2.3 定义数组的方法法一:
直接把要加入数组的元素用小括号括起来,中间用空格分开
[root@localhost hs]# arr=(1 2 3 4 5 6 7 8 9)
[root@localhost hs]# echo ${arr[*]}
1 2 3 4 5 6 7 8 9
法二:
精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
[root@localhost hs]# num=([0]=22 [1]=23 [2]=24 [3]=25 [4]=26)
[root@localhost hs]# echo ${#num[@]}
5
[root@localhost hs]# echo ${num[@]}
22 23 24 25 26
法三:
先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
[root@localhost hs]# list=“11 22 33 44”
[root@localhost hs]# li=($list)
[root@localhost hs]# echo ${li[*]}
11 22 33 44
法四:
可以把命令的结果用小括号括起来添加到数组,那么数组会以空格或者制表符区分每一个元素
[root@localhost hs]# echo “1 2 3 4 5 6”>A.txt
[root@localhost hs]# cat A.txt
1 2 3 4 5 6
[root@localhost hs]# liu=(cat A.txt)
[root@localhost hs]# echo ${liu[@]}
1 2 3 4 5 6
如:
[root@localhost hs]# arr=(1 2 3 4 5 6 7 8 9)
[root@localhost hs]# echo ${#arr[*]}
9
[root@localhost hs]# echo ${arr[2]}
3
数组名称: arr
数组元素: 1 ,2, 3, 4, 5, 6 ,7 ,8 ,9,数组元素默认是以空格分隔的
数组长度: 9 ,有9个元素
数组下标: 每个数组都有一个下标索引,一般从“0”开始,“3”是数组第三个元素 但他的下标索引是“2”
读取数据和元素
[root@localhost hs]# arr=(1 2 3 4 5 6 7 8 9) ##定义一个组
[root@localhost hs]# echo ${#arr[*]} ## 查看元素的个数
9
[root@localhost hs]# echo ${arr[2]} ##查看索引为2的元素
3
[root@localhost hs]# echo ${arr[@]} ##列出所有元素
1 2 3 4 5 6 7 8 9
[root@localhost hs]# echo ${!arr[*]} ##查看所有索引
0 1 2 3 4 5 6 7 8
[root@localhost hs]# declare -a | grep arr ##查看声明的所有变量可以看到数组
declare -a arr='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6" [6]="7" [7]="8" [8]="9")'
[root@localhost hs]# echo ${arr[*]:2:4} ##提取索引2开始的4个元素
3 4 5 6
[root@localhost hs]# arr[0]=77 ##替换元素
[root@localhost hs]# echo ${arr[*]}
77 2 3 4 5 6 7 8 9
[root@localhost hs]# echo ${arr[*]/3/33} ##临时替换元素
77 2 33 4 5 6 7 8 9
[root@localhost hs]# unset arr[1] ###删除索引为1的元素
[root@localhost hs]# echo ${arr[*]}
77 3 4 5 6 7 8 9
[root@localhost hs]# unset arr ##删除数组
[root@localhost hs]# echo ${arr[*]}
[root@localhost hs]#
2.6 数组的一些运用示例
示例
1.
#!/bin/bash
#将1-10数字加入数组
for i in {0…9}
do
arr[$ i]=$[i+1]
done
echo ${arr[*]}
或者
#!/bin/bash
list=seq 10
arr=($list)
echo ${arr[*]}
输出数组中最大的值
#!/bin/bash
arr=(5 10 15 20)
max=${arr[0]} ##先假设第一个元素最大,循环跟他做比较,如果后面有比他大的值就赋值给max,最后输出max
for ((i=0;i< $ {#arr[*]};i++ ))
do
if [ $max -lt ${arr[i]} ];then
max= $ {arr[i]}
fi
done
echo $max
3.
比较大小
array=(90 70 80 100 30 66)
echo "old_array:${array[*]}"
lt=${#array[*]}
#定义比较轮数,比较轮数为数组长度减一,从一开始
for ((i=1;i<$lt;i++))
do
#确定比较元素的位置,比较两个相邻元素,较大数往后放,比较次数随比较轮数减少
for ((j=0;j<$lt-i;j++))
do
#定义第一个元素的值
first=${array[$j]}
#定义第二个元素的值
k=$[$j+1]
second=${array[$k]}
#如果第一个元素比第二个元素大就互换
if [ $first -gt $second ];then
#把第一个元素的值保存到临时变量中
temp=$first
#把第二个元素的值赋给第一个元素
array[$j]=$second
#把临时的变量赋给第二个元素
array[$k]=$temp
fi
done
done
echo "new_array:${array[@]}"
总结:
函数的运用可以将复杂重复的工作模块化,以达到更高效的工作



