变量:用一个固定的字符串,代替一个不固定字符串。
数组:用一个固定的字符串,代替多个不固定字符串。
普通数组:只能使用整数作为数组索引
关联数组:可以使用字符串作为数组索引
总结:
变量切片有个索引的概念。一个索引(整数)对应一个字符。
普通数组:中的索引对应一个字符串。
关联数组:数组中的索引可以使用字符串。
方法一:
# array2=(tom jack alice)
# array3=(`cat/etc/passwd`) 将/etc/passwd文件中的每一行作为一个元素赋值给数组array3。
# array4=(`ls /var/ftp/Shell/for*`)
# array5=(tom jack alice "bash shell")
# colors=($red $blue $green $recolor)
# array6=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)
方法二:
一次赋一个值
数组名[下标]=变量值
# 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开始,访问两个元素
切记:先声明关联数组
方法一:
一次赋一个值
数组名[索引]=变量值
# declare -A ass_array1
# ass_array1[index1]=pear
# ass_array1[index2]=apple
# ass_array1[index3]=orange
# ass_array1[index4]=peach
查看
[root@localhost~]#echo ${ass_array1[@]}
peach pear apple orange
方法二
一次赋多个值
#declare -A ass_array2
# ass_array2={[index1]=tom [index2]=jack [index3]=alice [index4]='bash shell'}
# declare -A
declare -A ass_array1='([index4]="peach" [index1]="pear" [index2]="apple" [index3]="orange" )'
declare -A ass_array2='([index4]="bash shell" [index1]="tom" [index2]="jack" [index3]="alice" )'
# echo ${ass_array2[index2]} 访问数组中的第二个元数
# echo ${ass_array2[@]} 访问数组中所有元数等同于echo ${array1[*]}
# echo ${#ass_array2[@]} 获得数组元数的个数
# echo ${!ass_array2[@]} 获得数组元数的索引
1:通过循环定义和显示数组
2:通过数组统计数据
定义数组:
#!/bin/bash
#循环读取文件,定义数组
while read line
do
#hosts:数组名
#[++i]:索引递增,++i是1开始,i++是0开始。
#$line:值,即文件中的内容
hosts[++i]=$line
done
#输出索引每一行
for i in ${!hosts[@]}
do
echo "$i:${hosts[$i]}"
done
定义数组:
[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
区别:
for的空格分割
如何解决for的空格分割的问题。另外,如果脚本中还有for怎么办呢?
在Shell脚本中,for循环默认使用空格作为分隔符来分割字符串。如果字符串中包含空格,会导致for循环将其视为多个独立的项。为了解决这个问题,可以使用IFS(Internal Field Separator)环境变量来指定分隔符。
示例:
保存原始的IFS值
OLDIFS=$IFS
设置IFS为换行符
IFS=$'\n'
使用for循环遍历数组或字符串
for item in $array_or_string
do
# 在这里处理每个项
echo $item
done
恢复原始的IFS值
IFS=$OLDIFS
1.定义性别文件
[root@localhost ~]# vim sex.txt
jack m
alice f
tom m
2.定义脚本统计性别
#!/bin/bash
declare -A sex
while read line
do
type=`echo $line| awk '{print $2}
let sex[$type]++
done < sex.txt
for i in ${!sex[@]}
do
echo "$i:${sex[$i]}"
done
3.测试脚本
[root@localhost~]# bash sex.sh
f:1
m:2
示例:
declare -A shells
while read ii
do
type=`echo $ii | awk -F: '{print $NF}'`
let shells[$type]++
done
for i in ${!shells[*]}
do
echo "$i: ${shells[$i]}”
done
验证结果:
[rootetianyun scripts)# ./count_shells.sh
/sbin/nologin:45
/bin/sync:1
/bin/bash:170
/sbin/shutdown:1
/sbin/halt:1
概念:函数是一段完成特定功能的代码片段(块)在shell中定义了函数,就可以使代码模块化,便于复用代码。注意函数必须先定义才可以使用。
方法一:
函数名() {
函数要实现的功能代码
}
方法二:
function 函数名 {
函数要实现的功能代码
}
语法:function_name [arguments]
(function_name?是要调用的函数的名称,arguments?是传递给函数的参数(可选)。如果函数没有参数,可以省略?arguments?部分。)
需求:通过shell脚本,编写系统工具箱,编写循环脚本,功能菜单
provide these tools:
show disk info(d)
show mem info(m)
show cpu info(c)
quit(q)
思路:
演示:
#!/bin/bash
show_menu () {
cat
提供系统管理工具箱
1.磁盘信息管理工具
2.内存管理工具
3.CPU负载管理工具
4.查看帮助
5.退出
EOF
}
show_menu
while :
do
read -p "请输入您需要使用的工具序号:[帮助请按4]" num
case $num in
1)
echo "===========磁盘信息==========="
df -hT
echo "===========磁盘信息==========="
;;
2)
echo "===========内存信息==========="
free -m
echo "===========内存信息==========="
;;
3)
echo "===========CPU负载信息==========="
uptime
echo "===========CPU负载信息==========="
;;
4)
show_menu
;;
5)
exit
;;
esac
done