文章目录
- 1.函数
- 1.1Shell函数的概念
- 1.2函数的好处
- 1.2函数的组成
- 1.3函数的结构
- 1.4查看函数列表
- 1.5删除函数
- 1.6函数的返回值
- 1.6.1使用原则
- 1.6.2示例
- 1.7函数的作用范围
- 1.8函数递归
- 1.8.1示例
- 2.数组
- 2.1什么是数组
- 2.2数组的作用
- 2.3数组名和索引
- 2.4定义数组的方式
- 2.5普通数组和关联数组
- 2.5.1普通数组
- 2.5.2关联数组
- 2.6引用数组中的值
- 2.6.1数组包括的数据类型
- 2.6.2 获取数值长度
- 2.6.3 获取数值列表
- 2.6.4 读取某个下标赋值
- 2.7数组脚本内相关操作
- 2.7.1 数组遍历
- 2.7.2数据切片
- 2.7.3数组替换
- 2.7.4 删除数组
- 2.8 冒泡排序
- 2.8.1什么是冒泡排序
- 2.8.2 基本思想
- 2.8.3 算法思路
- 2.8.4 示例
- 2.9 数组示例
1.函数
1.1Shell函数的概念
函数的数学表达式sin、cos、tan 其实只是定义好的计算公式,函数就是一个功能模块,在函数中写好需要执行的命令即可
1.2函数的好处
- 使用函数可以避免代码重复
- 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
1.2函数的组成
函数名和函数体
1.3函数的结构
【1】
function 函数名 {
命令序列
}
【2】
函数名() {
命令序列
}
【3】
function 函数名 (){
命令序列
}
示例:
[root@localhost ~]#name () { hostname;}
#定义函数
[root@localhost ~]#name #输出函数
localhost.localdomain
注意事项
-
直接写 函数中调用函数 直接写函数名
-
同名函数 后一个生效
-
调用函数一定要先定义
-
只要先定义了调用的 其他函数定义顺序无关
1.4查看函数列表
declare -F
#查看当前已定义的函数名
declare -f
#查看当前已定义的函数定义
declare -f func_name
#查看指定当前已定义的函数名
declare -F func_name
#查看当前已定义的函数名定义
1.5删除函数
unset 函数名
#删除函数
1.6函数的返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
1.6.1使用原则
- 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
- 退出码必须是0-255,超出的值将为除以256取余
1.6.2示例
#!/bin/bash
test1 () {
read -p "请输入一个数字:" num
return $[$num*2]
}
test1
echo $?
1.7函数的作用范围
函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
1.8函数递归
函数调用自己本身的函数
1.8.1示例
阶乘
#定义函数
fach () {
if [ $1 -eq 0 -o $1 -eq 1 ]
then
echo 1
else
#调用函数
echo $[$1*$[(fach $[$1-1])]
fi
}
fach $1
2.数组
2.1什么是数组
数组是一种数据结构,用于存储一组相同类型的元素。
数组是一个连续的内存区域,元素在内存中按照顺序存储,每个元素可以通过索引访问,索引从0开始,逐个递增。
2.2数组的作用
数组可以存储各种类型的数据,例如整数、浮点数、字符、字符串等。
数组常用于存储和处理大量数据,提供了便捷的方式来访问和操作这些数据。
2.3数组名和索引
-索引的编号从0开始,属于数值索引
-索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引
-bash的数组支持稀疏格式(索引不连续)
2.4定义数组的方式
方式一:一次性赋值全部
数组名=(valueo0 value1 value2....)
方式二:通过下标赋值
数组名=([0]=value [1]=value [2]=value...)
方式三:先创建列表,再赋值
列表名=“value0 value1 value2.. ”
数组名=($列表名)
方式四:一个一个赋值
数组名[0]="value0"
数组名[1]="value1"
数组名[2]="value2"
方式五:交互型
read -a 数组名
#自行赋值
下标值和索引值表示相同的意思,即元素在数组中的位置
数组的下标值从0开始,逐个递增,用于唯一标识数组中的每个元素
2.5普通数组和关联数组
2.5.1普通数组
- 使用连续的整数值作为索引,从0开始递增
- 声明时使用 declare 或 declare -a 命令
- 元素之间的顺序是固定的,根据索引进行访问
示例
xinshi=("liu" "guan" "zhang")
echo ${xinshi[1]} #输出guan
echo ${xinshi[2]} #输出zhang
普通数组使用整数索引访问数组中的元素。
2.5.2关联数组
使用任意字符串作为键来访问和存储元素
声明时使用 declare -A 命令
元素之间的顺序是不固定的,通过键进行访问
示例
declare -A nianlin
nianlin["liu"]=30
nianlin["guan"]=45
echo ${nianlin[liu]} #输出30
echo ${nianlin[guan]} #输出45
关联数组使用字符串进行访问数组中的元素。
2.6引用数组中的值
2.6.1数组包括的数据类型
- 数值类型
- 字符类型
使用 " " 或 ’ ’ 定义
2.6.2 获取数值长度
echo ${#数组名 [*]}
echo ${#数组名[@]}
2.6.3 获取数值列表
echo ${数组名 [*]}
echo ${数组名[@]}
2.6.4 读取某个下标赋值
自定义名=${数组名[下标号]}
2.7数组脚本内相关操作
2.7.1 数组遍历
数组遍历是指按顺序访问数组中的每个元素。
#!/bin/bash
a=(1 2 3 4 5 6) #定义数组
for i in ${a[@]} #将数组内赋值定义循环变量
do
echo $i #输出变量
done
2.7.2数据切片
挑选数组中某一段进行输出
#!/bin/bash
a=(1 2 3 4 5 6)
#定义数组
echo ${a[@]:1:3}
#获取 ${数组名[@或*]:起始位置:长度} 的值
2.7.3数组替换
用当前所需数据替换原有数据
只是临时替换
#!/bin/bash
a=(1 2 3 4 5 6)
#定义源数组
echo ${a[*]/5/55}
#${数组名[@或*]/查找字符/替换字符}
echo ${a[*]}
#查看是不是永久替换
2.7.4 删除数组
整个删除
unset 数组名
选择删除
unset 数组名[下标号]
2.8 冒泡排序
2.8.1什么是冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
2.8.2 基本思想
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,
把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),
这样较小的元素就像气泡一样从底部上升到顶部。
2.8.3 算法思路
冒泡算法由双层循环实现
外部循环
用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。
内部循环
主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,
对比和交换次数随排序轮数而减少。
2.8.4 示例
升序排序
#!/bin/bash
a=(10 1 20 30 99 11) #定义数组
l=${#a[*]}
#定义比较轮数 比较轮数为数组长度减1,从1开始
for ((i=1;i<$l;i++))
do
for ((j=0;j<$l-1;j++))#确定比较元素的位置,比较相邻两个元素,较大的数往后放,比较次数随比较轮数而减少
do
first=${a[$j]} #定义第一个元素的值
k=$[$j+1] #定义第二个元素的值
second=${a[$k]}
if [ $first -gt $second ] #如果第一个元素比第二个元素大就互换
#如果小于就为降序
then
temp=$first
a[$j]=$second
a[$k]=$temp
#把临时变量(也就是第一个元素原值)赋给第二个元素
fi
done
done
echo ${a[@]}
#输出排序后的数组
2.9 数组示例
取出最大值
#!/bin/bash
a=(10 1 20 30 99 101) #定义数组
max=${a[0]}
l=${a[*]}
for ((i=0;i<$l;i++))
do
if [[ $max -lt ${a[$i+1]} ]]
then
max=${a[$i+1]}
fi
done
echo $max
取出最小值
#!/bin/bash
read -p "请输入数字与" num
a=($num)
min=${a[0]}
for ((i=0;i<${#a[*]}-1;i++))
do
if [[ $min -ge ${a[$i+1]} ]]
then
echo
min=${a[$i=1]}
fi
done
echo "数组中最小的是:" $min