1、在编写shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,既可以成为函数
2、合理使用shell函数,可以使脚本更加简洁,增强程序的易读性,提高执行效率
函数
#!/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
递归就是程序不断调用自身,递归方法就是方法直接或间接调用自身的方法。自己调用自己
列举出/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
公共
模板
视频
图片
文档
下载
音乐
桌面
数组就是把有限个元素变量或数组用一个名字命名,然后用编号区分他们的变量的集合。这个名字成为数组名,编号成为数组下标。组成数组的各个变量成为数组的分量,也称为数组的元素,有时也称为下标变量。
方法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 -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
选项:
-n:显示脚本错误
-v:显示脚本信息
-x:表示跟踪脚本
[root@localhost opt]# sh -x arr1.sh
arr1.sh:行5: 未预期的符号 `arr1[$i]=$[$i+1]' 附近有语法错误
arr1.sh:行5: `arr1[$i]=$[$i+1]'
选项:
-n:显示脚本错误
-v:显示脚本信息
-x:表示跟踪脚本
[root@localhost opt]# sh -x arr1.sh
arr1.sh:行5: 未预期的符号 `arr1[$i]=$[$i+1]' 附近有语法错误
arr1.sh:行5: `arr1[$i]=$[$i+1]'