Shell数组应用

数组是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


💡 感谢你读到这里!这篇《Shell数组应用》是我的用心分享,如果你觉得有收获,不妨:


点个「赞」或「分享」,让更多同路人相遇


🔍 关注我的博客,持续接收技术/成长类干货


💬 文末留言聊聊你的想法,或遇到的同类问题~


🔒 本文为原创,转载请保留原文链接(https://www.lichu228.top/archives/423)与作者信息,感谢尊重与支持!


🌐 想找更多优质内容?点击进入博客主页探索吧~


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇