Linux Shell 完整教程:从入门到精通
目录
-
(图片来源网络,侵删)- 什么是 Shell?
- 为什么学习 Shell?
- 如何打开 Shell(终端)?
- 第一个命令:
Hello, World!
-
- 命令的基本结构
- 文件和目录导航 (
ls,cd,pwd) - 文件和目录操作 (
mkdir,touch,cp,mv,rm) - 查看文件内容 (
cat,less,head,tail) - 文件权限 (
chmod,chown)
-
- 输入输出重定向 (
>,>>,<) - 管道 ()
- 通配符 (, ,
[]) - 命令历史与快捷键
- 用户与权限 (
sudo,su)
- 输入输出重定向 (
-
- 什么是 Shell 脚本?
- 第一个脚本:
hello.sh - 变量
- 参数传递 (
$1,$2, , ) - 条件判断 (
if-then-else) - 循环 (
for,while)
-
(图片来源网络,侵删)- 函数
- 使用别名 (
alias) - 任务控制 (
&,jobs,fg,bg) - 文本处理三剑客 (
grep,sed,awk) - 简介 - 调试脚本 (
set -x,echo)
第一部分:初识 Shell
什么是 Shell?
你可以把 Shell 想象成是用户与 Linux 内核之间的翻译官,你通过 Shell 输入命令,Shell 解释这些命令并告诉内核该做什么,然后将内核的执行结果反馈给你。
- 图形用户界面:通过点击图标、菜单来操作,直观但不够灵活。
- 命令行界面:通过输入文本命令来操作,学习曲线稍陡,但功能极其强大和高效。
Linux 中最常用的 Shell 是 Bash (Bourne Again Shell),大多数 Linux 发行版默认都使用它。
为什么学习 Shell?
- 自动化:编写脚本可以自动执行重复性任务,如备份文件、部署应用、监控系统等。
- 效率:熟练使用 Shell 可以让你快速完成复杂的文件操作和系统管理任务。
- 服务器管理:绝大多数服务器(如 Web 服务器、数据库服务器)没有图形界面,管理它们完全依赖于 Shell。
- 深入理解系统:通过 Shell,你可以直接与操作系统核心交互,更好地理解其工作原理。
如何打开 Shell(终端)?
- 在桌面环境中,通常可以按
Ctrl + Alt + T快速打开终端。 - 在应用程序菜单中搜索 "Terminal" 或 "终端"。
- 在服务器上,登录系统后你直接就进入了 Shell 环境。
第一个命令:Hello, World!
打开终端后,你会看到一个提示符,通常类似 user@hostname:~$。

输入以下命令并按回车:
echo "Hello, World!"
解释:
echo是一个命令,用于在终端输出指定的文本。"Hello, World!"是echo命令的参数,也就是要输出的内容。
恭喜!你已经成功执行了你的第一个 Shell 命令。
第二部分:Shell 基础入门
命令的基本结构
command [options] [arguments]
command: 你要执行的命令,如ls,cd。options: 选项,用来修改命令的行为,通常以 或 开头,如-l,--help。arguments: 参数,命令作用的对象,如文件名、目录名。
示例:
ls -l /home
ls: 列出文件和目录的命令。-l: 选项,表示以“长格式”(详细信息)显示。/home: 参数,表示要列出/home目录下的内容。
文件和目录导航
-
pwd(Print Working Directory): 显示你当前所在的目录。pwd # 输出: /home/user
-
ls(List): 列出当前目录下的文件和目录。ls # 列出文件名 ls -l # 列出详细信息(权限、所有者、大小、日期) ls -a # 列出所有文件,包括隐藏文件(以 . 开头) ls -la # 组合使用,列出所有文件的详细信息
-
cd(Change Directory): 切换目录。cd /var/log # 切换到 /var/log 目录 cd .. # 切换到上一级目录 cd ~ # 切换到当前用户的家目录 (/home/user) cd - # 切换到上一次所在的目录
文件和目录操作
-
mkdir(Make Directory): 创建新目录。mkdir my_folder # 创建一个名为 my_folder 的目录 mkdir -p dir1/dir2 # 创建嵌套目录,-p 确保父目录存在
-
touch: 创建一个空文件或更新文件的时间戳。touch new_file.txt
-
cp(Copy): 复制文件或目录。cp file1.txt file2.txt # 复制文件 cp -r my_folder my_backup # 复制目录,-r 表示递归(包含所有子文件和子目录)
-
mv(Move): 移动文件/目录,或重命名。mv file1.txt documents/ # 移动文件到 documents 目录 mv file2.txt file3.txt # 将 file2.txt 重命名为 file3.txt
-
rm(Remove): 删除文件或目录。rm file1.txt # 删除文件 rm -r my_folder # 删除目录(危险!) rm -rf my_folder # 强制删除目录(非常危险!请谨慎使用)
查看文件内容
-
cat(Concatenate): 一次性显示整个文件内容,适合查看短文件。cat long_file.log # 如果文件很大,终端会快速滚屏
-
less: 分页显示文件内容,适合查看长文件。less long_file.log
- 在
less中,你可以用j/k或上下箭头上下移动。 - 按
q退出。
- 在
-
head/tail: 查看文件的开头或结尾部分。head -n 20 long_file.log # 查看文件的前 20 行 tail -n 20 long_file.log # 查看文件的后 20 行 tail -f long_file.log # 实时追踪文件的更新(常用于查看日志)
文件权限
Linux 中,文件权限分为三类:所有者、所属组、其他人,每种身份都有三种权限:读、写、执行。
-
chmod(Change Mode): 修改文件权限。-
数字表示法:
r(读) = 4w(写) = 2x(执行) = 1- 无权限 = 0
chmod 755 my_script.sh:- 所有者:
7(4+2+1) =rwx - 所属组:
5(4+0+1) =r-x - 其他人:
5(4+0+1) =r-x
- 所有者:
-
符号表示法:
chmod u+x my_script.sh:给所有者增加执行权限。chmod g-w my_script.sh:给所属组移除写权限。chmod o+r my_script.sh:给其他人增加读权限。
-
-
chown(Change Owner): 修改文件的所有者。chown user:group file.txt # 将文件的所有者改为 user,所属组改为 group
第三部分:核心概念与技巧
输入输出重定向
默认情况下,命令的输出是标准输出,输入是标准输入,重定向可以改变这个默认行为。
-
>: 覆盖输出,将命令的输出结果写入文件,如果文件存在则覆盖。echo "Hello" > output.txt
-
>>: 追加输出,将命令的输出结果追加到文件末尾,如果文件不存在则创建。echo "World" >> output.txt
-
<: 输入重定向,让命令从文件中读取输入,而不是从键盘。sort < names.txt # 对 names.txt 文件中的内容进行排序
管道 ()
管道将一个命令的标准输出作为另一个命令的标准输入,这就像把多个命令“串联”起来,形成一个强大的处理链。
示例:只显示当前目录下文件列表中包含 "log" 的行。
ls -la | grep "log"
ls -la输出详细的文件列表。- 将这个输出传递给
grep命令。 grep "log"从输入中过滤出包含 "log" 的行并显示。
通配符
通配符用于匹配文件名。
-
匹配任意数量的任意字符。
ls *.txt # 列出所有以 .txt 结尾的文件 rm *.log # 删除所有以 .log 结尾的文件
-
匹配单个任意字符。
ls file?.txt # 匹配 file1.txt, file2.txt, 但不匹配 file10.txt
-
[]: 匹配方括号中指定的任意一个字符。ls file[1-3].txt # 匹配 file1.txt, file2.txt, file3.txt ls file[a-c].txt # 匹配 filea.txt, fileb.txt, filec.txt
命令历史与快捷键
-
命令历史:
history: 显示你之前执行过的所有命令。- 重复执行上一条命令。
!n: 执行历史中第 n 条命令 (!42)。!string: 执行历史中最近一个以 "string" 开头的命令 (!ls)。
-
快捷键:
Ctrl + C: 终止当前正在运行的命令。Ctrl + Z: 暂停当前命令,并将其放入后台。Ctrl + D: 输入文件结束符,相当于exit,退出当前 Shell。Ctrl + A: 光标移动到行首。Ctrl + E: 光标移动到行尾。Ctrl + R: 搜索命令历史(非常实用!)。
用户与权限
-
su(Switch User): 切换用户。su - username # 切换到 username 用户,并加载其环境变量
-
sudo(Superuser do): 以超级用户(root)或其他用户的身份执行命令,这是推荐的做法,因为它不需要知道 root 用户的密码。sudo apt update # 以管理员权限更新软件包列表 (Debian/Ubuntu) sudo yum install httpd # 以管理员权限安装 Apache 软件 (CentOS/RHEL)
- 第一次使用
sudo时会要求输入当前用户的密码。
- 第一次使用
第四部分:Shell 脚本编程入门
什么是 Shell 脚本?
Shell 脚本就是一个包含多条 Shell 命令的文本文件,通过执行这个文件,可以一次性运行所有命令,实现自动化任务。
第一个脚本:hello.sh
-
创建一个文件:
touch hello.sh
-
用文本编辑器(如
nano,vim)打开文件并写入以下内容:#!/bin/bash # 这是一个注释 echo "Hello from my first shell script!" # 创建一个目录并进入 mkdir -p scripts cd scripts echo "I am now in the $(pwd) directory."
-
保存并退出。
-
赋予执行权限:
chmod +x hello.sh
-
执行脚本:
./hello.sh
表示在当前目录下寻找并执行该文件。
第一行 #!/bin/bash 是 Shebang,它告诉系统这个脚本应该用哪个解释器(这里是 /bin/bash)来执行。
变量
- 定义变量:
变量名=变量值(注意: 两边不能有空格!)name="Alice" version=1.0
- 使用变量:在变量名前加 符号。
echo "Hello, $name" echo "Version: $version"
- 只读变量:使用
readonly命令,使其值不能被修改。readonly PI=3.14159 # PI=4 # 这会报错
- 删除变量:使用
unset命令。unset version
参数传递
当执行脚本时,可以向脚本传递参数。
| 参数 | 含义 |
|---|---|
$0 |
脚本文件名 |
$1, $2, ... |
脚本的第 1、2、... 个参数 |
| 传递给脚本的参数个数 | |
| 所有参数,作为一个单个字符串 | |
| 所有参数,作为多个独立的字符串 |
示例:创建一个 params.sh 脚本
#!/bin/bash echo "Script name: $0" echo "First argument: $1" echo "Second argument: $2" echo "Total arguments: $#" echo "All arguments together: $*" echo "All arguments separately: $@" echo "Looping through arguments:" for arg in "$@" do echo "Argument: $arg" done
执行:
chmod +x params.sh ./params.sh apple banana orange
条件判断 (if-then-else)
基本语法:
if [ condition ] then # 如果条件为真,执行这里的代码 elif [ another_condition ] then # 如果另一个条件为真,执行这里的代码 else # 如果以上条件都为假,执行这里的代码 fi
注意:[ 和 ] 是 test 命令的别名,它们和条件之间必须有空格!
常用条件判断:
- 文件判断:
-e filename: 文件是否存在-f filename: 是否为普通文件-d filename: 是否为目录-r filename: 是否可读-w filename: 是否可写
- 数值判断:
num1 -eq num2: 等于num1 -ne num2: 不等于num1 -gt num2: 大于num1 -lt num2: 小于
- 字符串判断:
str1 == str2: 相等str1 != str2: 不相等-z str: 字符串长度是否为 0
示例:check.sh
#!/bin/bash if [ -f $1 ] then echo "File $1 exists." else echo "File $1 does not exist." fi
执行:
./check.sh hello.sh # 输出: File hello.sh exists. ./check.sh non_existent.txt # 输出: File non_existent.txt does not exist.
循环
-
for循环:遍历一个列表。# 方法1: in 列表 for i in 1 2 3 4 5 do echo "Number: $i" done # 方法2: 遍历命令结果 (非常常用) echo "Files in current directory:" for file in $(ls) do echo "Found file: $file" done
-
while循环:只要条件为真,就持续执行。# 计数器 count=1 while [ $count -le 5 ] do echo "Count is: $count" count=$((count + 1)) # ((count++)) 在某些 shell 中也有效 done
第五部分:进阶与实用技巧
函数
将代码块封装成函数,便于复用。
#!/bin/bash
# 定义一个函数
greet() {
echo "Hello, $1! Welcome to $2."
}
# 调用函数
greet "Bob" "Linux World"
greet "Alice" "Shell Scripting"
使用别名 (alias)
为常用的长命令创建简短的别名。
# 创建别名 (临时有效,重启终端后失效) alias ll='ls -alF' alias ..='cd ..' # 让别名永久生效,需要将其写入配置文件 # 编辑 ~/.bashrc 或 ~/.zshrc 文件 echo 'alias ll="ls -alF"' >> ~/.bashrc source ~/.bashrc # 重新加载配置文件
任务控制
&: 在命令末尾加上&,可以让命令在后台运行,立即返回终端。sleep 30 & # sleep 命令会暂停 30 秒,但在后台运行,你可以立即输入下一个命令
jobs: 查看当前终端中所有后台运行的任务。fg(Foreground): 将一个后台任务调到前台运行。bg(Background): 将一个被暂停的任务(用Ctrl+Z暂停的)放到后台继续运行。
文本处理三剑客 (grep, sed, awk)
这是 Linux 文本处理的三大神器,功能强大,值得深入学习。
-
grep: 全局搜索正则表达式并打印,用于过滤行。ps aux | grep "nginx" # 查找所有包含 "nginx" 的进程行 grep -r "error" /var/log/ # 在 /var/log 目录下递归搜索包含 "error" 的行
-
sed: 流编辑器,用于编辑文本(如替换、删除、插入)。# 将文件中的 "apple" 替换为 "orange" (注意:默认不会修改原文件) sed 's/apple/orange/g' fruits.txt # 直接修改原文件 (谨慎使用) sed -i 's/apple/orange/g' fruits.txt
-
`awk``: 一种强大的报告生成器,用于处理**列。
# 打印 /etc/passwd 文件的第 1 列 (用户名) 和第 6 列 (家目录) awk -F: '{print $1, $6}' /etc/passwd # 计算文件中数字的总和 awk '{sum += $1} END {print sum}' numbers.txt
调试脚本
-
在脚本开头加入
set -x:这会打印出所有执行的命令及其参数,非常适合调试。#!/bin/bash set -x # 开启调试模式 name="Test" echo "The name is $name"
执行时会看到:
+ name=Test + echo 'The name is Test' The name is Test -
使用
echo:在关键变量或逻辑分支处插入echo命令,打印出变量的值或程序的执行流程。
第六部分:推荐资源与学习路径
学习路径建议
- 熟练掌握基础:每天花时间练习第二、三部分的所有命令,直到能不假思索地使用它们,这是最重要的基石。
- 动手写脚本:从简单的自动化任务开始,
- 一个备份脚本,将指定目录压缩并备份到另一个位置。
- 一个日志分析脚本,统计某个错误出现的次数。
- 深入学习文本处理:
grep,sed,awk是区分初级和中级用户的关键,先从grep开始,掌握sed的替换功能,再逐步学习awk。 - 阅读他人脚本:在 GitHub 等平台上寻找优秀的开源项目,阅读他们的 Shell 脚本,学习别人的编程风格和技巧。
- 探索更高级的主题:如信号处理、进程通信、更复杂的变量展开等。
推荐资源
-
交互式学习网站:
- learnshell.org: 纯在线交互式学习,边学边练。
- linuxjourney.com: 图文并茂,讲解清晰。
-
在线书籍与教程:
- The Linux Command Line (by William Shotts): 经典中的经典,免费在线阅读,内容详尽。
- ShellCheck: 一个在线的 Shell 脚本静态分析工具,可以帮助你找出脚本中的错误和不良实践,强烈推荐!
-
练习环境:
- 虚拟机:安装 VirtualBox 或 VMware,然后在里面安装一个 Linux 发行版(如 Ubuntu Server)进行练习。
- 云服务器:在阿里云、腾讯云等平台购买一台便宜的云服务器,这是最接近真实生产环境的练习方式。
-
社区:
- Stack Overflow: 遇到问题,先在这里搜索。
- Linux 相关论坛和 IRC 频道:与其他爱好者交流。
学习 Shell 是一个持续实践的过程,不要害怕犯错,大胆地去尝试、去组合命令、去编写你自己的脚本,祝你学习愉快!
