当前位置: 首页 > java >正文

Shell编程精髓:表达式与数组实战指南

一、表达式基础:逻辑与测试

1. 测试表达式基础
# 测试表达式两种写法
test 1 == 1  # 传统写法
[ 1 == 1 ]    # 常用写法(注意空格)# 检查命令执行状态
echo $?  # 0表示成功,1表示失败
2. 逻辑表达式实战
# && 逻辑与(全部成功才执行)
[ $# -eq 1 ] && echo "参数数量正确"# || 逻辑或(一个失败就执行)
[ $# -ne 1 ] || echo "参数数量错误"# ! 逻辑非(取反)
[ ! -f file.txt ] && echo "文件不存在"# 组合使用
[ -d /etc ] && echo "目录存在" || echo "目录不存在"

二、高级表达式应用

1. 字符串表达式
# 内容比较
[ $user == "root" ]  # 相等判断
[ $pass != "123" ]   # 不等判断# 空值判断
[ -z "$var" ]        # 空值返回真
[ -n "$var" ]        # 非空返回真
2. 文件表达式
# 属性判断
[ -f file.txt ]      # 普通文件
[ -d /tmp ]          # 目录文件
[ -L link ]          # 符号链接# 权限判断
[ -r file ]          # 可读
[ -x script.sh ]     # 可执行# 存在判断
[ -e path ]          # 存在
[ -s file ]          # 存在且非空
3. 数字表达式
# 数值比较
[ 10 -gt 5 ]        # 大于
[ 3 -eq 3 ]         # 等于
[ 4 -le 5 ]         # 小于等于
4. 条件组合技巧
# 使用-a/-o组合
[ $age -gt 18 -a $age -lt 60 ]  # 与关系
[ -f file -o -d dir ]           # 或关系# 使用&&/||组合
[[ $user == "admin" && $pass == "secret" ]]
[[ -r file || -w file ]]

三、数组操作全解析

1. 数组定义与操作
# 定义数组
files=(*.sh)                   # 文件列表
colors=("red" "green" "blue")  # 字符串数组
mixed=([0]=123 [2]="text")     # 混合数组(稀疏)# 获取元素
echo ${files[0]}               # 第一个元素
echo ${colors[@]}              # 所有元素
echo ${!mixed[@]}              # 所有索引# 数组长度
echo ${#colors[@]}             # 元素数量
echo ${#colors[0]}             # 第一个元素长度
2. 数组修改与删除
# 修改元素
colors[1]="yellow"            # 修改第二个元素
files[0]=${files[0]/.sh/.bak} # 修改扩展名# 删除元素
unset files[2]                # 删除第三个元素
unset colors                  # 删除整个数组
3. 关联数组(键值对)
# 声明和使用关联数组
declare -A user_info
user_info=([name]="John" [age]=30 [role]="admin")echo ${user_info[name]}        # 输出 John
echo ${!user_info[@]}          # 输出键名:name age role

四、实战案例解析

1. CPU负载统计脚本
#!/bin/bash
# 获取CPU负载信息
cpu_load=($(uptime | tr -s " " | cut -d " " -f 9-11 | tr "," " "))# 彩色输出结果
echo -e "\e[31m\t系统CPU负载信息\e[0m"
echo -e "\e[32m================================="
echo "CPU 1 min平均负载: ${cpu_load[0]}"
echo "CPU 5 min平均负载: ${cpu_load[1]}"
echo "CPU 15 min平均负载: ${cpu_load[2]}"
echo -e "=================================\e[0m"
2. 服务管理脚本
#!/bin/bash
# 定义操作数组
oper_array=("启动" "关闭" "重启" "重载" "状态")
declare -A cmd_array=(["启动"]="start"["关闭"]="stop"["重启"]="restart"["重载"]="reload"["状态"]="status"
)# 显示操作菜单
echo -e "\e[31m-----------服务操作动作-----------"
echo " 1: 启动  2: 关闭  3: 重启  4: 重载  5: 状态"
echo -e "--------------------------------------\e[0m"# 获取用户输入
read -p "> 请输入操作编号: " oper_num
index=$((oper_num-1))
operation=${oper_array[index]}# 显示执行命令
echo -e "\e[32m============服务执行动作============"
echo "将执行: systemctl ${cmd_array[$operation]} 服务名"
echo -e "======================================\e[0m"
3. 网络连通性测试
#!/bin/bash
read -p "输入测试IP: " ip_addr
[ -z "$ip_addr" ] && exit 1# 测试网络连通性
ping -c1 -w1 $ip_addr >/dev/null 2>&1
status=$([ $? -eq 0 ] && echo "正常" || echo "异常")# 结果输出
echo -e "\e[31m\t网络状态检测\e[0m"
echo -e "\e[32m================================"
echo "$ip_addr 状态: $status"
echo -e "================================\e[0m"

五、Shell编程最佳实践

  1. 表达式选择原则

    • 文件操作:优先使用文件表达式 -f, -d

    • 数值比较:使用数字表达式 -eq, -gt

    • 字符串处理:使用字符串表达式 ==, !=

    • 复杂逻辑:使用组合表达式 &&, ||

  2. 数组使用技巧

    # 遍历数组最佳方式
    for item in "${array[@]}"; doecho "处理: $item"
    done# 获取数组最后元素
    last_item=${array[-1]}# 数组切片
    echo ${array[@]:1:3}  # 从索引1开始取3个元素
  3. 错误处理增强

    set -euo pipefail  # 启用严格模式
    trap 'echo "错误发生在行 $LINENO"' ERR  # 错误捕获
http://www.xdnf.cn/news/12642.html

相关文章:

  • DbServer链接KingBase8(人大)数据库
  • Android座舱系统Agent改造方案
  • day 47
  • 微前端架构下的B端页面设计:模块化与跨团队协作的终极方案
  • Python爬虫-爬取各省份各年份高考分数线数据,进行数据分析
  • 国产pcie switch,支持PCIE 3.0/4.0/5.0,支持昇腾310/910 GPU,支持龙芯、海光、飞腾
  • 小白成长之路-Linux Shell脚本练习
  • 2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
  • Xilinx IP 解析之 Block Memory Generator v8.4 ——01-手册重点解读(仅 Native R
  • 前端开发面试题总结-JavaScript篇(二)
  • .Net Framework 4/C# 泛型的使用、迭代器和分部类
  • 本地windows服务器部署私有云网盘Nextcloud并无公网IP实现外部访问
  • 多线程中的泛型应用深度解析:类型安全与并发编程的完美融合
  • Java方法引用深度解析:从匿名内部类到函数式编程的演进
  • 算法训练第十天
  • 分享5个免费5个在线工具网站:Docsmall、UIED Tool在线工具箱、草料二维码、图片在线压缩、表情符号
  • 【嵌入式设备】使用PICO7抓取CH341A读写EEPROM的IIC波形
  • 视频字幕质量评估的大规模细粒度基准
  • 使用cd4060倒计时控制继电器,防止摩托车漏电
  • day 27 装饰器函数
  • SQL进阶之旅 Day 20:锁与并发控制技巧
  • C#:发送一封带有附件的邮件
  • Android实现点击Notification通知栏,跳转指定activity页面
  • 华为云Flexus+DeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建自己的自定义聊天助手
  • MATLAB-电偶极子所产出的电磁场仿真
  • 黑马点评【基于redis实现共享session登录】
  • 六、Sqoop 导出
  • 自适应长度惩罚强化学习的高效推理
  • [学习]扩频码测距原理、实现与精度分析(仿真代码)
  • 使用Python和Scikit-Learn实现机器学习模型调优