数组
是Shell脚本中非常重要的数据结构,在运维工作中能极大提高脚本处理批量数据的效率。
一、数组基础
1. 数组定义与初始化
# 索引数组(最常用)
arr1=(value1 value2 value3)
arr2=([0]=value1 [1]=value2 [2]=value3)
# 关联数组(类似字典,需先声明)
declare -A assoc_arr
assoc_arr=([key1]=value1 [key2]=value2)
2. 数组基本操作
# 访问元素
echo ${arr1[0]} # 输出value1
# 获取所有元素
echo ${arr1[@]} # 或 ${arr1[*]}
# 获取数组长度
echo ${#arr1[@]}
# 获取所有键/索引
echo ${!arr1[@]}
echo ${!assoc_arr[@]}
# 添加元素
arr1+=("value4") # 索引数组
assoc_arr+=([key3]="value3") # 关联数组
案例练习:
[root@lichu ~]# declare -A services
[root@lichu ~]# services=([nginx]=80 [mysql]=3306 [ssh]=22)
[root@lichu ~]# server_active=([nginx]="systemctl is-active nginx" [sshd]="systemctl is-active sshd")
[root@lichu ~]# echo ${services[ssh]}
22
[root@lichu ~]# echo ${services[@]}
80 22 3306
[root@lichu ~]# echo ${#services[@]}
3
[root@lichu ~]# echo ${!services[@]}
nginx ssh mysql
[root@lichu ~]# services+=([ftp]="21")
[root@lichu ~]# echo ${!services[@]}
nginx ftp ssh mysql
二、运维常用数组操作
1. 批量处理服务器列表
# 定义服务器列表数组
servers=("web01" "web02" "db01" "cache01")
# 批量执行命令
for server in "${servers[@]}"
do
echo "Processing $server..."
ssh "$server" "uptime"
done
2. 配置文件解析
# 解析/etc/passwd
declare -A users
while IFS=: read -r username _ uid gid _ _ _
do
users["$username"]="$uid:$gid"
done < /etc/passwd
# 查询特定用户信息
echo "root的UID和GID: ${users["root"]}"
3. 日志分析统计
# 统计HTTP状态码出现次数
declare -A status_codes
while read -r line
do
code=$(echo "$line" | awk '{print $9}')
if [[ $code =~ ^[0-9]+$ ]];then # 数组赋值
((status_codes["$code"]++))
fi
done < access.log
# 输出统计结果
for code in "${!status_codes[@]}"; do
echo "状态码 $code 出现 ${status_codes[$code]} 次" # 数组遍历
done
使用awk数组+for循环,一行简单的命令则可实现以上功能。
三、运维实战案例
1. 批量检查磁盘空间
#!/bin/bash
servers=("web01" "web02" "db01")
threshold=90
check_disk() {
local server=$1
local usage=$(ssh "$server" "df -h / | awk 'NR==2{print \$5}' | tr -d %")
if [ "$usage" -gt "$threshold" ]; then
echo "警告: $server 磁盘使用率 $usage% 超过阈值 $threshold%"
return 1
else
echo "$server 磁盘正常: $usage%"
return 0
fi
}
# 并行检查多个服务器
for server in "${servers[@]}"
do
{
check_disk "$server"
}&
done
wait
注:转义\$5
[root@lichu ~]# ssh 10.9.48.121 "df -h / | awk 'NR==2{print $5}' | tr -d %"
/dev/mapper/centos_lichu-root 17G 5.3G 12G 31 /
[root@lichu ~]# ssh 10.9.48.121 "df -h / | awk 'NR==2{print \$5}' | tr -d %"
31
2. 服务状态监控
#!/bin/bash
declare -A services=(
["nginx"]="systemctl is-active nginx"
["mysql"]="systemctl is-active mysql"
["redis"]="systemctl is-active redis"
)
check_services() {
for service in "${!services[@]}"
do
if ${services[$service]} >/dev/null; then
echo "$service 运行正常"
else
echo "警告: $service 未运行!"
fi
done
}
check_services
3. 批量用户创建
#!/bin/bash
# 用户名和密码数组
declare -A users=(
["dev1"]="Passw0rd1"
["dev2"]="Passw0rd2"
["ops1"]="Passw0rd3"
)
create_users() {
for user in "${!users[@]}"
do
if id "$user" &>/dev/null; then
echo "用户 $user 已存在"
else
useradd "$user"
echo "${users[$user]}" | passwd --stdin "$user" &>/dev/null
echo "已创建用户 $user"
fi
done
}
create_users