shell一个非常重要的特性是它可作为一种编程语言来使用。shell函数就是将命令序列按格式写在一起,方便重复使用命令序列。
shell把这些函数放在内存中,这样每次需要执行它们时就不必再从磁盘读入。
shell还以一种内部格式来存放这些函数,这样就不必耗费大量的时间来解释它们。
[ function ] 函数名(){
命令序列
[ return x]
}
其中,’’[ function ] 函数名(){’'定义函数,我们可以直接用"函数名(){"的方式定义函数。
"return"为函数输出返回值的一种方式,输出的数值我们可以进行修改。默认是以上一条命令的执行结果判定返回值。
定义完函数后,调用函数最直接的方式就是在脚本中直接调用,即直接输入函数名,有时候需要输入一些参数。
求和函数体
#!/bin/bash
sum(){
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
echo ”你输入的两个数字分别为$num1和$num2“
sum=$((num1+num2))
echo "两个数的和为$num"
return 17 ##设置返回值为17
}
sum ##调用此函数
还可以将函数在~/.bashrc文件中添加,将函数定义为用户的环境变量,就可以直接以函数名为命令,使用函数。如果是要全局使用,将函数写入全局环境变量配置文件/etc/profile中。
shell脚本中变量默认为全局有效,可以使用local命令限定只在函数内部使用。
递归函数简单来说就是在函数内部直接或者间接调用自己本身。
递归函数查看/var/log
#!/bin/bash
function list_files(){
for f in `ls $1`
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@localhost ~]# sh digui.sh
anaconda
anaconda.log
ifcfg.log
journal.log
ks-script-2jWz3Q.log
packaging.log
program.log
storage.log
syslog
X.log
audit
audit.log
boot.log
boot.log-20200615
boot.log-20200616
boot.log-20200714
boot.log-20200717
boot.log-20200719
boot.log-20200721
boot.log-20200722
btmp
btmp-20200714
chrony
cron
cron-20200609
cron-20200614
cron-20200714
cron-20200719
cups
access_log
access_log-20200609
access_log-20200614
access_log-20200714
access_log-20200719
error_log
page_log
dmesg
dmesg.old
firewalld
gdm
:0-greeter.log
:0-greeter.log.1
:0-greeter.log.2
:0-greeter.log.3
:0-greeter.log.4
:0.log
:0.log.1
:0.log.2
:0.log.3
:0.log.4
:1-greeter.log
:1.log
glusterfs
grubby_prune_debug
httpd
access_log
access_log-20200719
error_log
error_log-20200719
lastlog
libvirt
qemu
maillog
maillog-20200609
maillog-20200614
maillog-20200714
maillog-20200719
messages
messages-20200609
messages-20200614
messages-20200714
messages-20200719
ntpstats
pluto
peer
ppp
qemu-ga
rhsm
sa
sa14
sa15
sa16
sa17
sa19
sa20
sa21
sa22
sa23
sa24
sa25
sar16
sar20
sar21
sar22
sar23
samba
old
secure
secure-20200609
secure-20200614
secure-20200714
secure-20200719
speech-dispatcher
spooler
spooler-20200609
spooler-20200614
spooler-20200714
spooler-20200719
sssd
swtpm
libvirt
qemu
tallylog
tuned
tuned.log
vmware-network.1.log
vmware-network.2.log
vmware-network.3.log
vmware-network.4.log
vmware-network.5.log
vmware-network.6.log
vmware-network.7.log
vmware-network.8.log
vmware-network.9.log
vmware-network.log
vmware-vgauthsvc.log.0
vmware-vmsvc.log
vmware-vmusr.log
wpa_supplicant.log
wtmp
Xorg.0.log
Xorg.0.log.old
Xorg.1.log
Xorg.9.log
yum.log
Shell 数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。Shell 数组元素的下标从 0 开始计数。
Shell 并且没有限制数组的大小,理论上可以存放无限量的数据,并且不限制数据类型。
数组名=(value0 value1 value2 ... )
数组名=([0]=value [1]=value [2]=value...)
列表名="value0 value1 value2 ..."
数组名=($列表名)
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
...
数组包括数值类型、字符类型。
输出1-99的奇数为一个数组,命名为shuzu1.sh
#!/bin/bash
for i in `seq 1 2 97`
do
arr[$i]=$[$i+2]
done
arr[0]=1
echo ${arr[*]}
[root@localhost ~]# sh shuzu1.sh
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
输出1-99的奇数为一个数组,命名为shuzu3.sh
#!/bin/bash
k=0
j=1
for ((i=0;i<=99;i++))
do
k=$[$i+$j]
let j++
if [ $k -le 100 ]
then
arr[$i]=$[$k]
fi
done
echo ${arr[*]}
[root@localhost ~]# sh shuzu3.sh
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
将给定的数组从左到右升序排列
#!/bin/bash
score=(72 63 90 45 75)
len=${#score[*]} ##数组长度
for ((i=0;i<$len;i++));do
for ((j=i+1;j<$len;j++));do
if [ ${score[i]} -gt ${score[j]} ];then
temp=${score[i]}
score[i]=${score[j]}
score[j]=$temp
fi
done
done
echo ${score[*]}
#!/bin/bash
#创建任意数字及长度的数组,根据客户的需求加入元素
i=0 #数组的下标
while true
do
read -p "是否输入元素(yes/no):" doing
if [ $doing == no ]
then
break
fi
read -p "请存入第$[$i+1]个元素:" key
shuzu[$i]=$key
let i++
done
echo ${shuzu[*]}