Linux Shell编程及自动化运维实现之数组和函数

一、数组

简介:

1、数组简介

变量:用一个固定的字符串表示一个不固定的字符串。

数组:用一个固定的字符串,表示多个不固定字符串。

2、类型

普通数组:只能使用整数作为数组索引。

关联数组:可以使用字符串作为数组索引。

3、图示

总结:

变量切片有个索引的概念。一个索引(整数)对应一个字符。

普通数组:中的索引对应一个字符串。

关联数组:数组中的索引可以使用字符串。

普通数组:

 1、定义数组

方法一:

一次赋一个值

数组名[下标]=变量值

 array1[0]=pear
 array1[1]=apple
 array1[2]=orange
 array1[3]=peach

查看数组

[root@localhost ~]# declare -a | grep array1
declare -a array1='([0]="pear" [1]="apache" [2]="orange" [3]="peach")'

查看数组

[root@localhost ~]# echo ${array1[@]}
pear apache orange peach  //按顺序输出输出出来

 访问数组元素

#echo ${array1[0]} 访问数组中的第一个元数
# echo ${array1[@]} 访问数组中所有元数 等同于 echo ${array1[*]}
# echo ${#array1[@]} 统计数组元素的个数
# echo ${!array2[@]} 获取数组元素的索引
# echo ${array1[@]:1} 从数组下标1开始
# echo ${array1[@]:1:2} 从数组下标1开始,访问两个元素

关联数组:先声明关联数组

索引为文字型的。

方法一:一次赋一个值

数组名[索引]=变量值

[root@master1 ~]# declare -A array6   //先声明关联数组
[root@master1 ~]# array6[up]=baiqi
[root@master1 ~]# array6[centert]=daji
[root@master1 ~]# array6[down]=houyi
[root@master1 ~]# echo ${array6[*]}
baiqi houyi daji   //输出的值不按顺序的

方法二:一次赋多个值

declare  -A  ass_array2
ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]='bash shell')

访问数组元素

# echo ${ass_array2[index2]} 访问数组中的第二个元数
# echo ${ass_array2[@]} 访问数组中所有元数 等同于 echo ${array1[*]}
# echo ${#ass_array2[@]} 获得数组元数的个数
# echo ${!ass_array2[@]} 获得数组元数的索引

数组和循环:

1、通过循环定义和显示数组

2、通过数组统计数据

eg1:while脚本快速定义数组

[root@master1 ~]# vim array.sh

#!/bin/bash
while read line
do
hosts[++i]=$line
done < /etc/hosts   //将/etc/hosts里的内容传输给while循环
for a in ${!hosts[@]}
do
echo "$a"
echo "${hosts[$a]}"
done

查看结果:while是使用回车作为分隔符的。

[root@master1 ~]# bash array.sh  //运行编写的脚本
1
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
2
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
3
10.8.162.122 master1
4
10.8.162.125 master2
5
10.8.162.89  slave1
6
10.8.162.109 slave2

eg2:for脚本快速定义数组

[root@localhost ~]# vim for_array.sh 
#!/bin/bash
#2020
#for array
for line in `cat /etc/hosts`
do
        hosts[++i]=$line
done
for i in ${!hosts[@]}
do
echo "$i:  ${hosts[$i]}"
done

查看结果

[root@master1 ~]# bash for_array.sh
0
127.0.0.1
1
localhost
2
localhost.localdomain
3
localhost4
4
localhost4.localdomain4
5
::1
6
localhost
7
localhost.localdomain
8
localhost6
9
localhost6.localdomain6
10
10.8.162.122
11
master1
12
10.8.162.125
13
master2
14
10.8.162.89
15
slave1
16
10.8.162.109
17
slave2

ps:可以看出来for循环是按照空格来分隔行的。

解决按空格分隔,使他变成按回车分隔。

[root@master1 ~]# vim for_array.sh

OLD_IFS=$IFS
IFS=$'\n'
for line in `cat /etc/hosts`
do
   hosts[i++]=$line
done
for i in ${!hosts[@]}
do
echo $i
echo "${hosts[$i]}"
done
IFS=$OLD_IFS

eg3:数组统计性别:

[root@master1 ~]# vim sex.sh

#!/bin/bash
declare -A sex
while read line
do
type=`echo $line | awk '{print $2}'`  //awk只看某一列。
let sex[$type]++
done <  sex.txt

for i in ${!sex[@]}
do
echo "$i: ${sex[$i]}"
done

 查看结果

[root@master1 ~]# bash sex.sh
f: 2  //女的两个
m: 3  //男的三个

eg4:使用数组统计,用户shell的类型和数量:

[root@master1 ~]# vim shell.sh

#!/bin/bash
declare -A a
while read b
do
type=`echo $b | awk -F: '{print $7}'`
let a[$type]++
done  < /etc/passwd

for i in ${!a[@]}
do
echo "$i: ${a[$i]}"
done

结果:

[root@master1 ~]# bash shell.sh
/sbin/nologin: 17
/bin/sync: 1
/bin/false: 1
/bin/bash: 10
/sbin/shutdown: 1
/sbin/halt: 1

二、函数

    函数是一段完成特定功能的代码片段(块),在shell中定义了函数,就可以使代码模块化,便于复用代码。注意函数必须先定义才可以使用。 

1、定义函数

方法一:

 函数名() {

函数要实现的代码部分

}

方法二:

function 函数名 {
函数要实现的功能代码
}

2、调用函数

函数名

函数名  参数1  参数2

编写循环脚本,功能菜单。

[root@master1 ~]# vim hanshu.sh

#!/bin/bash
han() {
cat << EOF
provude these tools:
show disk info(d)
show mem info(m)
show cpu info(c)
quit(q)
EOF
}

while :
do
han
read -p "input choice:" choice
      case $choice in
         d)
          df -hT
         ;;
         m)
         free -m
         ;;
         c)
         uptime
         ;;
      q)
         break
         ;;
         *)
         han
         ;;
      esac
done

结果

[root@master1 ~]# bash hanshu.sh
provude these tools:
show disk info(d)
show mem info(m)
show cpu info(c)
quit(q)
input choice:d  
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  898M     0  898M    0% /dev
tmpfs                   tmpfs     910M     0  910M    0% /dev/shm
tmpfs                   tmpfs     910M  9.6M  901M    2% /run
tmpfs                   tmpfs     910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        17G  5.2G   12G   31% /
/dev/sda1               xfs      1014M  150M  865M   15% /boot
tmpfs                   tmpfs     182M     0  182M    0% /run/user/0
provude these tools:
show disk info(d)
show mem info(m)
show cpu info(c)
quit(q)

制作函数用于阶乘(传参)

[root@master1 ~]# vim jiecheng.sh

#!/bin/bash
#定义函数名fun1
fun1() {
#定义阶乘元数
factorial=1
#使阶乘循环
for((i=1;i<=5;i++))
do
#阶乘公式
factorial=$[$factorial*$i]
done
#输出阶乘结果
echo “5的阶乘是:$factorial”
}
fun 5

优化1:传参,让函数能够自定义

[root@master1 ~]# vim jiecheng.sh

#!/bin/bash
#定义函数名fun1
fun1() {
#定义阶乘元数
factorial=1
#使阶乘循环
for((i=1;i<=$i;i++))
do
#阶乘公式
factorial=$[$factorial*$i]
done
#输出阶乘结果
echo “$i的阶乘是:$factorial”
}
fun 5
fun 6
fun 7

优化2:传参2,由脚本外部传递参数

[root@master1 ~]# vim jiecheng.sh

#!/bin/bash
#定义函数名fun1
fun1() {
#定义阶乘元数
factorial=1
#使阶乘循环
for((i=1;i<=$i;i++))
do
#阶乘公式
factorial=$[$factorial*$i]
done
#输出阶乘结果
echo “$i的阶乘是:$factorial”
}
fun $1
fun $2
fun $3

优化3:shell写法和其他表达式

#!/bin/bash
fun1() {
factorial=1
#for((i=1;i<=$1;i++))
for i in `seq $1`
do
#factorial=$[$factorial*$i]
#let factorial=$factorial*$i
let factorial*=$i
done
echo “$1的阶乘是:$factorial”
}

fun1  $1

猜你喜欢

转载自blog.csdn.net/yiweii/article/details/108442125