#定义函数
[root@localhost data]#func (){ hostname;uname -r; }
#调用
[root@localhost data]#func
localhost.localdomain
3.10.0-693.el7.x86_64
1、格式一:
function 函数名{
命令序列
}
2、格式二:
函数名(){
命令序列
}
3、格式三:
function func_name () {
...函数体...
}
注意事项
[root@localhost data]#vim ww.sh
#!/bin/bash
q () {
#q表示定义的函数名
echo "nihao"
#命令序列
}
q
#此处的q表示调用这个函数
[root@localhost data]#bash ww.sh
nihao
#判断操作系统
[root@localhost data]#vim xitong.sh
#!/bin/bash
os () {
if grep -q centos /etc/os-release;then
echo "centos"
#如果是操作系统是centos,则输出centos
elif grep -q ubuntu /etc/os-release;then
echo "ubuntu"
#如果是操作系统是ubuntu,则输出ubuntu
else
echo "can not support"
#如果都不是以上操作系统,则输出can not support
fi
}
os
#调用
declare -F
#查看当前已定义的函数名
declare -f
#查看当前已定义的函数定义(查看函数具体信息)
declare -f func_name
#查看指定当前已定义的函数名
declare -F func_name
#查看当前已定义的函数名定义
#查看当前已定义的所有函数名
[root@localhost data]#declare -F
declare -f __HOSTNAME
declare -f __SIZE
declare -f __SLAVEURL
declare -f __VOLNAME
declare -f __expand_tilde_by_ref
declare -f __get_cword_at_cursor_by_ref
declare -f __ltrim_colon_completions
declare -f __parse_options
declare -f __reassemble_comp_words_by_ref
declare -f _allowed_groups
declare -f _allowed_users
declare -f _available_fcoe_interfaces
declare -f _available_interfaces
declare -f _cd
declare -f _cd_devices
……
#查看当前已定义的函数定义(查看函数具体信息)
[root@localhost data]#declare -f
__HOSTNAME ()
{
local zero=0;
local ret=0;
local cur_word="$2";
if [ "$1" == "X" ]; then
return;
else
if [ "$1" == "match" ]; then
return 0;
else
if [ "$1" == "complete" ]; then
COMPREPLY=($(compgen -A hostname -- $cur_word));
fi;
fi;
fi;
return 0
}
……
unset 函数名
#删除函数
默认取决于函数中执行的最后一条命令的退出状态码
自定义退出状态码,其格式为:
[root@localhost data]#vim dz.sh
#!/bin/bash
ip () {
read -p "请输入一个ip地址:" host
[[ "$host" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || { echo "$host ip地址是非法的";return 1; }
#return 1表示执行脚本后,自定义的一个退出状态码(范围是0~255)
}
ip
echo $?
#验证
[root@localhost data]#bash dz.sh
请输入一个ip地址:192.168.10.1128
192.168.10.1128 ip地址是非法的
1
[root@localhost data]#bash dz.sh
请输入一个ip地址:192.168.10.13
0
[root@localhost data]#bash dz.sh
请输入一个ip地址:192.168.10.100
0
函数传参是指在调用自定义函数时向该函数传递参数的过程。这些参数可以
在函数内部作为变量使用,以便函数能够根据传入的数据执行不同的任务或操作
[root@localhost data]#vim test.sh
#!/bin/bash
q () {
echo "第一个参数是 $1 $2 $3"
}
q $1 $2 $3
[root@localhost data]#bash test.sh xx01 xx02 xx03
第一个参数是 xx01 xx02 xx03
[root@localhost data]#vim test.sh
#!/bin/bash
q () {
echo "第一个参数是 $1 $2 $3"
}
q $2 $1 $3
[root@localhost data]#bash test.sh xx01 xx02 xx03
第一个参数是 xx02 xx01 xx03
#输入参数的顺序就是位置参数的顺序
函数在shell脚本中仅在当前的shell环境中有效
shell脚本中函数的变量默认全局有效
将变量限定在函数内部使用local命令
[root@localhost data]#name=qi
[root@localhost data]#func1 (){ name=xxx;echo $name; }
[root@localhost data]#func1
xxx
[root@localhost data]#echo $name
xxx
[root@localhost data]#name=qi
[root@localhost data]#func1 (){ local name=xxx;echo $name; }
[root@localhost data]#func1
xxx
[root@localhost data]#echo $name
qi
#函数变量会影响当前环境,使用local命令将变量限制在函数内
#用循环语句for求阶乘
[root@localhost data]#vim qaz.sh
#!/bin/bash
sum=1
read -p "请输入一个数字:" num
for i in `seq $num`
do
let sum=$[i*sum]
done
echo $sum
#验证
[root@localhost data]#bash qaz.sh
请输入一个数字:5
120
[root@localhost data]#bash qaz.sh
请输入一个数字:6
720
#用函数求阶乘
[root@localhost data]#vim jc.sh
#!/bin/bash
fact () {
if [ $1 -eq 1 ];then
echo 1
#定义变量,表示数字是1时,阶乘就是1
else
local temp=$[$1-1]
#表示求num的阶乘,先要知道num-1的结果
local result=`fact $temp`
#定义变量,表示将数字代入fact $temp中计算阶乘结果
echo $[$1*result]
fi
}
fact $1
#验证
[root@localhost data]#bash jc.sh 6
720
[root@localhost data]#
[root@localhost data]#bash jc.sh 5
120
[root@localhost data]#a=(10 20 30 40 50 60)
[root@localhost data]#echo ${a[0]}
10
[root@localhost data]#echo ${a[1]}
20
[root@localhost data]#echo ${a[2]}
30
[root@localhost data]#echo ${a[@]}
10 20 30 40 50 60
[root@localhost data]#echo ${a[*]}
10 20 30 40 50 60
1、格式一:
数组名=(value0 value1 value2 value3 ......)
2、格式二:
数组名=([0]=value [1]=value1 [2]=value2 ....)
3、格式三:
列表名="value0 value1 value2 value3 ...... "
数组名=($列表名)
4、格式四:(追加,修改)
数组名[0]="value1"
数组名[1]="value2"
数组名[2]="value3"
5、格式五:(交互式)
read -a
#普通数组可以不事先声明,直接使用
declare -a
#关联数组必须先声明,再使用
declare -A
[root@localhost data]#declare -A th
#先声明关联数组th
[root@localhost data]#th[aaa]=1
[root@localhost data]#th[bbb]=xx
[root@localhost data]#th[ccc]=user
#调用(调用结果正常,不会发生混乱)
[root@localhost data]#echo ${th[aaa]}
1
[root@localhost data]#echo ${th[bbb]}
xx
echo ${数组名[*]}
echo ${数组名[@]}
[root@localhost data]#a=(10 20 30 40 50 60)
[root@localhost data]#echo ${a[@]}
10 20 30 40 50 60
[root@localhost data]#echo ${a[*]}
10 20 30 40 50 60
echo ${#数组名[*]}
echo ${#数组名[@]}
echo ${!数组名[@]} #显示下标
echo ${数组名[索引值]} #输出数组索引值对应的元素,索引值为从0开始
[root@localhost ~]#a=( 10 20 30 40 50 )
[root@localhost ~]#echo ${#a[*]}
5
[root@localhost ~]#echo ${#a[@]}
5
[root@localhost ~]#echo ${!a[@]}
0 1 2 3 4
[root@localhost ~]#echo ${a[4]}
50
数组名=(元素0 元素1 元素2 ……)
#定义数组
echo ${数组名[索引值]}
#输出数组索引值对应的元素,索引值为从0开始
[root@localhost data]#vim xx.sh
#!/bin/bash
a=( 10 20 30 40 50 60 )
for i in ${a[@]}
do
echo $i
done
[root@localhost data]#bash xx.sh
10
20
30
40
50
60
[root@localhost data]#a=( 10 20 30 40 50 )
[root@localhost data]#echo ${a[@]:2:1}
30
#从第2个开始,打印后面1个
[root@localhost data]#echo ${a[@]:2}
30 40 50
#从第2个开始,打印后面所有
[root@localhost data]#a=( 10 20 30 40 50 )
[root@localhost data]#echo ${a[@]/20/22}
10 22 30 40 50
#将20替换为22
[root@localhost data]#a=( 10 20 30 40 50 )
[root@localhost data]#unset a
#删除数组
[root@localhost data]#echo ${a[@]}
[root@localhost data]#a=( 10 20 30 40 50 )
[root@localhost data]#unset a[3]
#删除下标为3的字符
[root@localhost data]#echo ${a[@]}
10 20 30 50
#取数组中的最大值
[root@localhost data]#vim ww.sh
#!/bin/bash
read -p "请输入数组:" num
a=($num)
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
#验证
[root@localhost data]#bash ww.sh
请输入数组:11 22 33 44 55 66
66
#取数组中的最小值
[root@localhost data]#vim ww.sh
#!/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
min=${a[$i+1]}
fi
done
echo $min
#验证
[root@localhost data]#bash ww.sh
请输入数组:12 54 23 10 28 16
10
#取数组中最大最小值
[root@localhost data]#vim ww.sh
#!/bin/bash
for i in {0..9}
do
a[$i]=$RANDOM
[ $i -eq 0 ] && min=${a[0]} && max=${a[0]}
[ ${a[$i]} -gt $max ] && max=${a[$i]}
[ ${a[$i]} -lt $min ] && min=${a[$i]}
done
echo ${a[@]}
echo max=$max
echo min=$min
#验证
[root@localhost data]#bash ww.sh
3381 17295 31518 1029 28915 882 26524 17146 26545 11764
max=31518
min=882
冒泡排序就是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(将两个元素的位置交换),这样较小的元素就像气泡一样从底部上升到顶部。
[root@localhost data]#vim xx.sh
#!/bin/bash
for i in {0..9}
do
a[$i]=$RANDOM
done
l=${#a[@]}
for ((i=1;i<l;i++))
do
for ((j=0;j<l-i;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[@]}
#验证
[root@localhost data]#bash xx.sh
532 1455 3806 4851 13327 19564 20539 25252 28395 31752
[root@localhost data]#
[root@localhost data]#bash xx.sh
3315 10565 11395 11656 13473 15993 22154 22575 29378 32576
[root@localhost data]#
[root@localhost data]#bash xx.sh
1145 6146 12651 15228 21022 24752 25416 25782 26332 29219