shell 命令(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在编程和系统管理的世界中,shell 命令如同一把瑞士军刀,能够高效完成文件操作、数据处理、自动化任务等场景。无论是编程初学者还是中级开发者,掌握 shell 命令不仅能提升工作效率,还能深入理解操作系统的底层逻辑。本文将从基础到进阶,结合实际案例,逐步解析 shell 命令的核心知识点,并通过比喻和代码示例,让读者轻松掌握这一工具。


一、基础命令:构建命令行思维

1.1 理解 Shell 的角色

Shell 是用户与操作系统内核之间的桥梁,类似“导航系统”。当你输入 lscd 时,shell 会解析指令并执行对应的系统操作。常见的 shell 包括 Bash(Linux/macOS 默认)和 Zsh(更现代的替代品)。

常用基础命令示例

命令功能描述
cd [目录]切换目录,类似“导航到某个房间”
ls列出目录内容,如同“查看房间内的物品”
pwd显示当前路径,相当于“询问自己的位置”
mkdir [目录名]创建新目录,类似“搭建一个新储物柜”

案例

cd ~  
ls -a  
mkdir project  

1.2 文件与目录操作

1.2.1 文件查看与编辑

  • cat:合并文件或输出内容到终端,类似“快速预览文件”。
    cat file.txt  # 查看文件内容  
    
  • less:分页查看大文件,支持滚动和搜索。
    less large.log  
    
  • nano/vim:文本编辑器,适合直接修改文件。

1.2.2 文件管理

  • cp:复制文件或目录。
    cp file.txt backup/  # 将文件复制到 backup 目录  
    
  • mv:移动或重命名文件。
    mv old_name.txt new_name.txt  # 重命名文件  
    
  • rm:删除文件或目录(慎用!)。
    rm -r directory/  # 强制删除目录及子目录  
    

1.3 搜索与过滤:数据处理的“筛子”

1.3.1 grep:文本搜索

grep 可以在文件中搜索关键词,支持正则表达式。

grep "error" system.log  # 搜索包含 "error" 的日志行  

比喻grep 就像图书馆的索引系统,快速定位目标内容。

1.3.2 find:目录搜索

find 在指定路径下递归搜索文件。

find /var/log -name "*.log"  # 查找所有以 .log 结尾的文件  

技巧:结合 -exec 参数执行操作,例如删除旧文件:

find /tmp -type f -mtime +7 -exec rm {} \;  # 删除 7 天前的临时文件  

二、流程控制与脚本编写:自动化的核心

2.1 条件判断:if 语句

通过条件判断实现逻辑分支。

if [ -f "file.txt" ]; then  
  echo "文件存在"  
else  
  echo "文件不存在"  
fi  

符号解释-f 表示“是否存在且为文件”,-d 表示“目录”。

2.2 循环结构:批量处理

for 循环

遍历列表或文件内容。

for file in *.txt; do  
  echo "处理文件: $file"  
done  

案例:批量重命名文件:

for file in *.jpg; do  
  mv "$file" "backup_$file"  # 添加前缀 "backup_"  
done  

while 循环

持续执行直到条件不满足。

count=0  
while [ $count -lt 5 ]; do  
  echo "计数: $count"  
  ((count++))  
done  

2.3 Shell 脚本:将命令组合成工具

将多个命令保存为脚本文件(如 script.sh),并通过 chmod +x script.sh 赋予执行权限。
示例脚本

#!/bin/bash  
BACKUP_DIR="/backup/$(date +%Y%m%d)"  
mkdir -p $BACKUP_DIR  
tar -czf $BACKUP_DIR/data.tar.gz /var/www  
echo "备份完成!路径: $BACKUP_DIR"  

执行方式

./script.sh  

三、高级技巧:组合命令与重定向

3.1 管道符 |:命令的“流水线”

通过 | 将前一个命令的输出作为下一个命令的输入。

ls -l | grep "txt" | wc -l  # 统计目录中以 txt 结尾的文件数量  

比喻:管道符如同工厂流水线,每个环节处理一部分任务。

3.2 重定向:控制输入输出

  • 输出重定向
    ls > output.txt  # 将 ls 结果保存到文件  
    echo "Hello" >> log.txt  # 追加内容到文件末尾  
    
  • 输入重定向
    sort < numbers.txt  # 将文件内容作为 sort 的输入  
    

3.3 变量与函数

变量定义

NAME="Alice"  
echo "你好,$NAME!"  # 你好,Alice!  

函数封装

calculate_sum() {  
  echo $(($1 + $2))  
}  
result=$(calculate_sum 3 5)  
echo "结果: $result"  # 输出 8  

四、实战案例:构建日志分析工具

4.1 场景描述

假设需要分析服务器日志,统计访问量最高的前 5 个 IP 地址。

4.2 解决方案

  1. 提取 IP 地址:使用 awk 提取日志中的第一列(假设日志格式为 IP 时间 请求)。
    awk '{print $1}' access.log > ips.txt  
    
  2. 统计频率:用 sort 排序后,uniq -c 统计次数。
    sort ips.txt | uniq -c > ip_counts.txt  
    
  3. 排序并筛选:按次数降序排列,取前 5 行。
    sort -nr ip_counts.txt | head -n 5  
    

4.3 完整脚本

#!/bin/bash  
LOG_FILE="access.log"  
OUTPUT="top_ips.txt"  

awk '{print $1}' "$LOG_FILE" | \  
sort | \  
uniq -c | \  
sort -nr | \  
head -n 5 > "$OUTPUT"  

echo "结果已保存至 $OUTPUT"  

五、进阶优化:环境变量与自动化

5.1 环境变量

通过 export 设置环境变量,全局或局部生效。

export PATH=$PATH:/new/tool/dir  # 扩展可执行路径  

5.2 自动化任务:cron

通过 crontab 定时执行脚本。

0 2 * * * /path/to/backup.sh  

结论

掌握 shell 命令 是开发者通往高效工作的关键一步。从基础命令到脚本编写,再到自动化流程,每一步都能显著提升生产力。通过本文的案例和代码示例,读者可以逐步构建自己的命令行工具箱,并在实际项目中灵活应用。无论是快速处理文件、分析日志,还是部署自动化任务,shell 都能成为你可靠的伙伴。

继续深入探索,你会发现 shell 的更多可能性——例如结合 sedawk 进行复杂文本处理,或通过 ssh 实现远程管理。保持实践,你的命令行技能将不断精进!

最新发布