技术学习 · DoggyDad 原创

Shell 入门完全指南:从零开始掌握命令行

面向初学者的 Shell 使用教程,涵盖基础命令、文件操作、管道重定向等核心概念,帮助你快速上手命令行操作。基于 MIT Missing Semester 课程整理。

ANSWER-FIRST SUMMARY

本文回答什么问题

面向初学者的 Shell 使用教程,涵盖基础命令、文件操作、管道重定向等核心概念,帮助你快速上手命令行操作。基于 MIT Missing Semester 课程整理。

  • 主题分类:技术学习
  • 关键词:Shell、命令行、Linux、终端、入门教程、Bash

Shell 入门完全指南

什么是 Shell?

当你打开终端(Terminal)时,看到的那个等待你输入命令的界面,就是 Shell

Shell 是一个命令行解释器,它接收你输入的文本命令,然后告诉操作系统去执行相应的操作。你可以把它想象成你和计算机之间的”翻译官”。

你输入命令 → Shell 解释 → 操作系统执行 → 返回结果

为什么要学 Shell?

你可能会问:有图形界面(GUI)为什么还要学命令行?

  1. 效率更高:很多操作用命令行比点鼠标快得多
  2. 自动化:可以编写脚本批量处理任务
  3. 远程操作:服务器通常只有命令行界面
  4. 更强大:有些操作只能通过命令行完成
  5. 程序员必备:几乎所有开发工具都需要命令行

Shell 的种类

最常见的 Shell 有:

Shell说明
Bash最流行的 Shell,Linux 默认
ZshmacOS 默认,功能更丰富
Fish用户友好,自动补全强大
PowerShellWindows 的现代 Shell

本文主要以 Bash 为例,但大部分命令在其他 Shell 中也通用。

第一步:打开终端

macOS

  • Cmd + Space,输入 “Terminal”
  • 或在 应用程序 → 实用工具 → 终端

Windows

  • 安装 Windows Terminal
  • 或使用 WSL(Windows Subsystem for Linux)
  • Win + R,输入 cmdpowershell

Linux

  • Ctrl + Alt + T
  • 或在应用菜单中搜索 “Terminal”

Shell 基础概念

命令提示符(Prompt)

打开终端后,你会看到类似这样的内容:

username@hostname:~$

这就是命令提示符,它告诉你:

  • username:当前用户名
  • hostname:计算机名称
  • ~:当前所在目录(~ 表示家目录)
  • $:普通用户(# 表示 root 用户)

执行第一个命令

试着输入 date 并按回车:

$ date
Sat Dec 14 10:30:00 CST 2024

恭喜!你刚刚执行了第一个 Shell 命令。

命令的基本结构

命令 [选项] [参数]

例如:

$ ls -l /home
  • ls:命令(列出目录内容)
  • -l:选项(使用长格式显示)
  • /home:参数(要列出的目录)

文件系统导航

理解路径

在 Shell 中,文件位置用路径表示:

  • 绝对路径:从根目录 / 开始的完整路径

    /home/username/documents/file.txt
    
  • 相对路径:相对于当前目录的路径

    documents/file.txt
    

特殊目录符号

符号含义
/根目录(所有文件的起点)
~家目录(你的个人文件夹)
.当前目录
..上级目录

核心导航命令

pwd - 显示当前目录

$ pwd
/home/username

pwd = Print Working Directory(打印工作目录)

cd - 切换目录

# 进入指定目录
$ cd /home/username/documents

# 进入家目录
$ cd ~
$ cd    # 不带参数也是回到家目录

# 返回上级目录
$ cd ..

# 返回上一个目录
$ cd -

ls - 列出目录内容

# 列出当前目录
$ ls
Desktop  Documents  Downloads

# 列出详细信息
$ ls -l
drwxr-xr-x  2 user user 4096 Dec 14 10:00 Desktop
drwxr-xr-x  5 user user 4096 Dec 14 09:30 Documents

# 显示隐藏文件(以 . 开头的文件)
$ ls -a
.  ..  .bashrc  .config  Desktop  Documents

# 组合使用
$ ls -la

# 列出指定目录
$ ls /etc

ls -l 输出解读

drwxr-xr-x  2 user group 4096 Dec 14 10:00 Desktop
│└──┬───┘  │  │    │     │        │         │
│   │      │  │    │     │        │         └─ 文件名
│   │      │  │    │     │        └─ 修改时间
│   │      │  │    │     └─ 文件大小(字节)
│   │      │  │    └─ 所属组
│   │      │  └─ 所有者
│   │      └─ 链接数
│   └─ 权限(rwx = 读/写/执行)
└─ 类型(d=目录,-=文件,l=链接)

文件和目录操作

创建

# 创建目录
$ mkdir my_folder

# 创建多级目录
$ mkdir -p parent/child/grandchild

# 创建空文件
$ touch newfile.txt

# 创建并写入内容
$ echo "Hello World" > hello.txt

复制

# 复制文件
$ cp source.txt destination.txt

# 复制到目录
$ cp file.txt /path/to/directory/

# 复制目录(需要 -r 递归)
$ cp -r source_folder destination_folder

移动和重命名

# 移动文件
$ mv file.txt /new/location/

# 重命名文件(本质上是移动)
$ mv oldname.txt newname.txt

# 移动目录
$ mv folder /new/location/

删除

# 删除文件
$ rm file.txt

# 删除目录(需要 -r 递归)
$ rm -r folder

# 强制删除(不提示确认)
$ rm -rf folder

# ⚠️ 警告:rm 删除的文件无法恢复!

查看文件内容

# 显示全部内容
$ cat file.txt

# 分页查看(按 q 退出)
$ less file.txt

# 查看前 10 行
$ head file.txt
$ head -n 20 file.txt  # 前 20 行

# 查看后 10 行
$ tail file.txt
$ tail -n 20 file.txt  # 后 20 行

# 实时查看文件更新(常用于日志)
$ tail -f logfile.log

获取帮助

遇到不熟悉的命令?有几种方式获取帮助:

man - 查看手册

$ man ls

q 退出,/ 搜索,n 下一个匹配。

—help 选项

$ ls --help

tldr - 简化版手册(推荐)

# 安装 tldr
$ npm install -g tldr

# 使用
$ tldr tar

tldr 提供简洁的常用示例,比 man 更容易理解。

输入输出重定向

Shell 的强大之处在于可以灵活地处理输入和输出。

标准流

每个程序都有三个标准流:

编号说明
stdin0标准输入(键盘)
stdout1标准输出(屏幕)
stderr2标准错误(屏幕)

输出重定向

# 将输出写入文件(覆盖)
$ echo "Hello" > output.txt

# 将输出追加到文件
$ echo "World" >> output.txt

# 重定向错误输出
$ command 2> error.log

# 同时重定向标准输出和错误
$ command > output.txt 2>&1
$ command &> all.log  # 简写形式

输入重定向

# 从文件读取输入
$ sort < unsorted.txt

# Here Document(多行输入)
$ cat << EOF
第一行
第二行
第三行
EOF

管道(Pipe)

管道 | 是 Shell 最强大的特性之一,它将一个命令的输出作为另一个命令的输入。

# 基本语法
命令1 | 命令2 | 命令3

实用示例

# 查找包含 "error" 的行
$ cat log.txt | grep "error"

# 统计文件行数
$ cat file.txt | wc -l

# 排序并去重
$ cat names.txt | sort | uniq

# 查看目录中最大的 5 个文件
$ ls -lS | head -n 5

# 查找进程
$ ps aux | grep "python"

# 实时监控日志中的错误
$ tail -f app.log | grep "ERROR"

管道的思维方式

管道体现了 Unix 哲学:每个程序只做一件事,做好它,然后通过管道组合

# 统计当前目录下 .js 文件的总行数
$ find . -name "*.js" | xargs wc -l | tail -1

常用命令速查

文件搜索

# 按名称查找文件
$ find /path -name "*.txt"

# 按内容搜索(grep)
$ grep "pattern" file.txt
$ grep -r "pattern" /path  # 递归搜索
$ grep -i "pattern" file   # 忽略大小写
$ grep -n "pattern" file   # 显示行号

文本处理

# 统计行数、单词数、字符数
$ wc file.txt
$ wc -l file.txt  # 只统计行数

# 排序
$ sort file.txt
$ sort -n file.txt  # 数字排序
$ sort -r file.txt  # 逆序

# 去重
$ uniq file.txt
$ sort file.txt | uniq  # 通常配合 sort 使用

# 截取列
$ cut -d',' -f1 data.csv  # 以逗号分隔,取第一列

系统信息

# 查看磁盘使用
$ df -h

# 查看目录大小
$ du -sh /path

# 查看内存使用
$ free -h

# 查看进程
$ ps aux
$ top      # 实时监控
$ htop     # 更好的 top(需安装)

# 查看系统信息
$ uname -a

网络相关

# 下载文件
$ curl -O https://example.com/file.zip
$ wget https://example.com/file.zip

# 测试网络连接
$ ping google.com

# 查看网络配置
$ ifconfig
$ ip addr  # Linux 推荐

权限管理

理解权限

$ ls -l file.txt
-rw-r--r-- 1 user group 1024 Dec 14 10:00 file.txt

权限分为三组:

  • 所有者(Owner):文件创建者
  • 组(Group):所属用户组
  • 其他(Others):其他所有人

每组有三种权限:

  • r(read):读取
  • w(write):写入
  • x(execute):执行

修改权限

# 使用符号模式
$ chmod u+x file.sh    # 给所有者添加执行权限
$ chmod g-w file.txt   # 移除组的写权限
$ chmod o=r file.txt   # 设置其他人只读

# 使用数字模式(r=4, w=2, x=1)
$ chmod 755 script.sh  # rwxr-xr-x
$ chmod 644 file.txt   # rw-r--r--

修改所有者

# 修改所有者
$ chown newuser file.txt

# 修改所有者和组
$ chown newuser:newgroup file.txt

# 递归修改
$ chown -R user:group directory/

环境变量

环境变量是 Shell 中存储配置信息的方式。

查看环境变量

# 查看所有环境变量
$ env
$ printenv

# 查看特定变量
$ echo $PATH
$ echo $HOME

设置环境变量

# 临时设置(仅当前会话)
$ export MY_VAR="hello"

# 永久设置(添加到配置文件)
$ echo 'export MY_VAR="hello"' >> ~/.bashrc
$ source ~/.bashrc  # 重新加载配置

重要的环境变量

变量说明
PATH命令搜索路径
HOME家目录路径
USER当前用户名
SHELL当前使用的 Shell
PWD当前工作目录

修改 PATH

# 添加新路径到 PATH
$ export PATH="$PATH:/new/path"

# 添加到配置文件使其永久生效
$ echo 'export PATH="$PATH:$HOME/bin"' >> ~/.bashrc

快捷键提升效率

掌握这些快捷键,让你的命令行操作飞起来:

光标移动

快捷键功能
Ctrl + A移到行首
Ctrl + E移到行尾
Ctrl + B后退一个字符
Ctrl + F前进一个字符
Alt + B后退一个单词
Alt + F前进一个单词

编辑操作

快捷键功能
Ctrl + U删除到行首
Ctrl + K删除到行尾
Ctrl + W删除前一个单词
Ctrl + Y粘贴删除的内容
Ctrl + L清屏

历史命令

快捷键功能
/ 浏览历史命令
Ctrl + R搜索历史命令
!!执行上一条命令
!$上一条命令的最后一个参数
history查看命令历史

进程控制

快捷键功能
Ctrl + C终止当前命令
Ctrl + Z暂停当前命令
Ctrl + D退出当前 Shell

实战练习

练习 1:文件整理

创建以下目录结构并练习基本操作:

# 创建项目目录
$ mkdir -p project/{src,docs,tests}

# 创建一些文件
$ touch project/src/{main.py,utils.py}
$ touch project/docs/README.md
$ touch project/tests/test_main.py

# 查看结构
$ ls -R project

练习 2:日志分析

# 创建模拟日志
$ cat << EOF > app.log
2024-12-14 10:00:00 INFO Starting application
2024-12-14 10:00:01 DEBUG Loading config
2024-12-14 10:00:02 ERROR Database connection failed
2024-12-14 10:00:03 INFO Retrying connection
2024-12-14 10:00:04 INFO Connected successfully
2024-12-14 10:00:05 WARNING High memory usage
EOF

# 查找所有错误
$ grep "ERROR" app.log

# 统计各级别日志数量
$ cut -d' ' -f3 app.log | sort | uniq -c

练习 3:批量重命名

# 创建测试文件
$ touch file{1..5}.txt

# 查看文件
$ ls *.txt

# 批量添加前缀
$ for f in *.txt; do mv "$f" "backup_$f"; done

# 查看结果
$ ls backup_*

进阶学习资源

在线课程

书籍推荐

  • 《The Linux Command Line》- William Shotts(免费在线阅读)
  • 《Learning the bash Shell》- O’Reilly

练习平台

速查表

总结

Shell 是每个开发者的必备技能。记住这些要点:

  1. ✅ 从基础命令开始:cdlspwdcat
  2. ✅ 理解路径:绝对路径 vs 相对路径
  3. ✅ 善用管道 | 组合命令
  4. ✅ 用 mantldr 查看帮助
  5. ✅ 多练习,熟能生巧

命令行看起来可能有点吓人,但一旦掌握,你会发现它是最高效的工具。


参考资料


最后更新:2024-12-14

DISCUSSION

评论与补充