目录
一、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[@]}