简介:
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