Shell编程学习笔记04

第四章、数组函数

数组

数组简介

变量:用一个固定的字符串,代替一个不固定字符串。

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

类型

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

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

总结:

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

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

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

普通数组

定义数组:

方法一:

# 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:通过数组统计数据

案例

案例1:while脚本快速定义数组

定义数组:

#!/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

案例2: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

区别:

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

案例3:数组统计性别

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

案例4:使用数组统计,用户shell的类型和数量

示例:

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)

思路:

  1. 编写菜单和判断.
  2. 添加循环
  3. 添加函数

演示:

#!/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

你可能感兴趣的:(学习,笔记)