Linux命令与Shell编程实战指南

📅 2026/7/16 11:23:48
Linux命令与Shell编程实战指南
1. Linux常用命令与Shell编程基础概述作为一名Linux系统管理员我每天的工作都离不开命令行操作和Shell脚本编写。Linux命令是操作系统与用户交互的基础工具而Shell编程则是将这些命令组合起来实现自动化任务的强大武器。对于初学者来说掌握这两项技能是进入Linux世界的必经之路。Linux命令可以分为以下几大类文件操作命令如ls、cp、mv、文本处理命令如grep、awk、sed、系统管理命令如ps、top、df以及网络相关命令如ping、netstat、ssh。这些命令通过BashBourne Again Shell解释执行构成了Linux系统日常操作的基础。Shell编程则是将这些命令按照特定逻辑组织起来形成可重复执行的脚本。一个典型的Shell脚本可能包含变量定义、条件判断、循环控制等编程元素再结合各种Linux命令就能完成从简单到复杂的各种系统管理任务。我经常用Shell脚本来自动化日常维护工作比如日志轮转、备份恢复、服务监控等。2. Linux常用命令详解2.1 文件与目录操作命令文件操作是Linux系统管理中最基础也最频繁的任务。以下是我在实际工作中最常用的命令ls列出目录内容。我最常用的参数组合是ls -lht可以显示详细信息(-l)、人类可读的文件大小(-h)并按时间排序(-t)。例如查看最近修改的文件ls -lht /var/log | head -5cp复制文件。重要参数包括-r递归复制目录和-p保留文件属性。生产环境中复制重要文件时我习惯先使用-n参数测试cp -nvr source_dir/ backup_dir/mv移动或重命名文件。这个命令的危险性在于会直接覆盖目标文件所以我通常会先ls确认目标路径。rm删除文件。使用-rf组合时要特别小心我曾在凌晨3点误删过整个应用目录。现在我的习惯是rm -i file_to_delete # 交互式删除重要提示生产环境执行删除操作前建议先用echo测试命令echo rm -rf /path/to/dir/*2.2 文本处理三剑客grep、awk和sed被称为Linux文本处理三剑客我几乎每天都会用到它们grep文本搜索。我最常用的几个技巧grep -n error logfile.log # 显示行号 grep -v debug logfile.log # 反向匹配 grep -A3 -B2 exception app.log # 显示匹配行前后内容awk强大的文本分析工具。提取nginx日志中的IP和访问量awk {print $1} access.log | sort | uniq -c | sort -nr | head -10sed流编辑器。批量替换配置文件中的内容sed -i.bak s/old_value/new_value/g config.properties2.3 系统监控与管理命令系统管理员需要时刻掌握系统状态这些命令是我的得力助手top/htop实时监控系统资源。我习惯用top -c显示完整命令用htop进行更直观的交互。df/du磁盘空间检查。关键参数df -hT # 人类可读格式显示文件系统类型 du -sh * | sort -h # 排序显示目录大小ps进程查看。我最常用的组合ps aux --sort-%mem | head # 按内存排序 ps -ef | grep java # 查找特定进程netstat/ss网络连接检查。查看正在监听的端口netstat -tulnp # 或者更现代的ss命令 ss -tulnp3. Shell编程基础与实践3.1 Shell脚本基础结构一个标准的Shell脚本通常包含以下部分#!/bin/bash # 注释脚本描述、作者、版本等信息 # 变量定义 LOG_DIR/var/log/myapp BACKUP_DIR/backup/$(date %Y%m%d) # 函数定义 function check_disk_space() { local threshold$1 # 函数实现 } # 主程序逻辑 main() { # 脚本主要逻辑 } # 脚本入口 main $3.2 变量与参数处理Shell变量使用有一些特殊注意事项变量赋值时等号两边不能有空格引用变量建议用${var}形式特别是在字符串拼接时特殊变量$0脚本名$1-$9位置参数$#参数个数$?上条命令返回值处理命令行参数的最佳实践while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -v|--verbose) VERBOSEtrue shift ;; *) echo Unknown option: $1 exit 1 ;; esac done3.3 流程控制Shell脚本中的条件判断和循环if语句if [[ -f $FILE ]]; then echo File exists elif [[ -d $DIR ]]; then echo Directory exists else echo Not found fifor循环for file in /path/to/*.log; do gzip $file done # C风格for循环 for ((i0; i10; i)); do echo Count: $i donewhile循环while read -r line; do echo Processing: $line done input.txt3.4 函数与模块化良好的Shell脚本应该遵循模块化原则# 日志函数 log() { local level$1 local message$2 echo [$(date %Y-%m-%d %H:%M:%S)] [$level] $message $LOG_FILE # 根据日志级别不同处理 case $level in ERROR) send_alert $message ;; esac } # 使用示例 log INFO Script started if ! perform_operation; then log ERROR Operation failed exit 1 fi4. 实用Shell脚本案例4.1 日志分析脚本这是一个分析Nginx日志的实用脚本#!/bin/bash LOG_FILE$1 OUTPUT_FILEreport_$(date %Y%m%d).txt analyze_log() { echo Top 10 IPs: $OUTPUT_FILE awk {print $1} $LOG_FILE | sort | uniq -c | sort -nr | head -10 $OUTPUT_FILE echo -e \nTop 10 URLs: $OUTPUT_FILE awk {print $7} $LOG_FILE | sort | uniq -c | sort -nr | head -10 $OUTPUT_FILE echo -e \nStatus Code Summary: $OUTPUT_FILE awk {print $9} $LOG_FILE | sort | uniq -c | sort -nr $OUTPUT_FILE } main() { [[ -f $LOG_FILE ]] || { echo Log file not found; exit 1; } analyze_log echo Report generated: $OUTPUT_FILE } main $4.2 系统监控脚本服务器监控脚本示例#!/bin/bash ALERT_THRESHOLD90 EMAILadminexample.com check_disk() { local usage$(df -h / | awk NR2 {print $5} | tr -d %) (( usage ALERT_THRESHOLD )) \ send_alert Disk usage $usage% on $(hostname) } check_memory() { local free$(free -m | awk NR2 {print $4}) (( free 100 )) \ send_alert Low memory: ${free}MB left on $(hostname) } send_alert() { local message$1 echo $message | mail -s ALERT: $(hostname) $EMAIL # 也可以集成短信或Slack通知 } main() { check_disk check_memory # 添加其他检查... } main5. Shell编程高级技巧5.1 错误处理与调试健壮的Shell脚本需要完善的错误处理#!/bin/bash # 严格模式 set -euo pipefail trap echo Error at line $LINENO ERR # 调试模式 # set -x function cleanup() { # 清理临时文件 rm -f $TEMP_FILE echo Cleanup completed } trap cleanup EXIT # 脚本主体 TEMP_FILE$(mktemp) important_operation $TEMP_FILE5.2 性能优化Shell脚本性能优化经验减少子进程调用# 不好 - 创建了两个子进程 var$(echo $var | tr [:lower:] [:upper:]) # 更好 - 使用内置功能 var${var^^}避免不必要的cat# 不好 cat file | grep pattern # 更好 grep pattern file使用here document代替echo# 生成配置文件 cat config.ini EOF [database] host localhost port 3306 EOF5.3 安全实践Shell脚本安全注意事项总是验证用户输入if [[ ! $input ~ ^[a-zA-Z0-9_]$ ]]; then echo Invalid input exit 1 fi使用-r选项防止反斜杠转义while read -r line; do # 安全处理每一行 done file.txt敏感信息处理# 不要在脚本中硬编码密码 # 使用环境变量或配置文件确保权限正确 DB_PASSWORD${DB_PASSWORD:-} if [[ -z $DB_PASSWORD ]]; then read -s -p Enter DB password: DB_PASSWORD fi6. 实用资源与进阶学习6.1 常用命令速查表这是我整理的常用命令速查表类别命令描述文件操作ls -lht列出文件(按时间排序)cp -rpv复制(保留属性)find / -name *.log查找文件文本处理grep -n error搜索文本(显示行号)awk {print $1}提取字段sed -i s/old/new/替换文本系统管理ps aux --sort-%mem查看进程(按内存排序)du -sh *查看目录大小tar -czvf backup.tgz创建压缩包6.2 推荐学习路径根据我的经验建议按以下顺序学习基础命令ls,cd,cp,mv,rm,cat,grep文件权限chmod,chown,umask文本处理awk,sed,cut,sort,uniq系统管理ps,top,df,du,free网络工具ping,netstat,ssh,scpShell编程变量、条件、循环、函数高级主题信号处理、并发控制、正则表达式6.3 调试技巧当脚本出现问题时我常用的调试方法使用set -x启用调试模式#!/bin/bash set -x # 脚本内容 set x检查命令返回值if ! command; then echo Command failed with status $? fi记录执行日志exec (tee -a $LOG_FILE) 21使用ShellCheck工具检查语法shellcheck script.sh掌握Linux命令和Shell编程需要持续练习。我建议从简单的自动化任务开始比如定期备份脚本逐步过渡到更复杂的系统管理工具。记住每个专家都是从新手开始的关键是要保持学习和实践的热情。