# Learning-Linux-Shell **Repository Path**: kunjs/learning-linux-shell ## Basic Information - **Project Name**: Learning-Linux-Shell - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-01-15 - **Last Updated**: 2026-01-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Learning Linux Shell ## 每周学习内容 ### 第一周(week1/) - day1.md: Shell 基础概念 - day2.md: 文件系统导航 - day3.md: 文件操作基础 - day4-1.md: 文件内容查看 - day4-2.md: vi/vim命令 - day5.md: 阶段性检查 - 基础命令测试 - day6.md: 文本搜索与查找 - day7.md: 输入输出重定向 ### 第二周(week2/) - day1.md: 文本处理工具 - day2.md: 进程管理 - day3.md: Shell 变量与环境 - day4.md: 条件判断与流程控制 - day5.md: 阶段性检查 - 进阶操作测试 - day6.md: 循环结构 - day7.md: 函数定义与调用 ### 第三周(week3/) - day1.md: Shell 脚本基础 - day2.md: 命令行参数处理 - day3.md: 数组操作 - day4.md: 字符串处理 - day5.md: 阶段性检查 - 脚本编程测试 - day6.md: 错误处理与调试 - day7.md: 实战项目启动 ### 第四周(week4/) - day1.md: 实战项目开发 - day2.md: 实战项目开发 - day3.md: 高级主题 - day4.md: 实战项目优化 - day5.md: 阶段性检查 - 项目完成 - day6.md: 知识梳理与总结 - day7.md: 最终检查与展望 ## 命令索引 ### Week 1: 基础入门 #### Day 1: Shell 基础概念 - `echo $SHELL` - 查看当前使用的 Shell - `cat /etc/shells` - 查看系统安装的所有 Shell - `bash --version` - 查看当前 Shell 的版本 - `echo $$` - 查看当前 Shell 的 PID - `history` - 查看当前 Shell 的历史命令 - `cat ~/.bashrc` - 查看 .bashrc 配置文件 - `env` - 查看当前 Shell 的环境变量 - `which bash` - 查找 bash 的安装位置 #### Day 2: 文件系统导航 - `pwd` - 显示当前工作目录 - `ls` - 列出目录内容 - `ls -l` - 以长格式显示(详细信息) - `ls -a` - 显示所有文件,包括隐藏文件 - `ls -h` - 以人类可读的格式显示文件大小 - `ls -t` - 按修改时间排序 - `ls -r` - 反向排序 - `ls -F` - 在目录名后添加 `/` 标识 - `ls --color=auto` - 以彩色显示不同类型的文件 - `cd /path/to/dir` - 切换到指定目录 - `cd ~` - 切换到用户主目录 - `cd ..` - 切换到上级目录 - `cd -` - 切换到上一次所在的目录 - `ls -ld week1` - 查看目录的详细信息 #### Day 3: 文件操作基础 - `touch test.txt` - 创建空文件 - `mkdir mydir` - 创建目录 - `mkdir -p parent/child/grandchild` - 递归创建多级目录 - `mkdir -v newdir` - 创建目录并显示详细信息 - `rm -i test.txt` - 删除文件(带确认) - `rm -r mydir` - 递归删除目录 - `rm -rf parent` - 强制删除目录(不提示) - `cp newdir/newfile.txt newfile_copy.txt` - 复制文件 - `cp -r newdir newdir_copy` - 复制目录 - `cp -p newdir/newfile.txt newfile_preserved.txt` - 复制并保留文件属性 - `mv newfile_copy.txt renamed_file.txt` - 重命名文件 - `mv renamed_file.txt newdir/` - 移动文件到目录 - `mv newdir_copy moved_dir` - 移动目录 #### Day 4-1: 文件内容查看 - `cat /etc/hostname` - 连接并显示文件内容 - `cat -n /etc/hostname` - 显示行号 - `less /etc/passwd` - 分页查看文件(支持双向翻页和搜索) - `more /etc/passwd` - 分页查看文件(只能向下翻页) - `head -n 3 /etc/passwd` - 显示文件前几行 - `tail -n 3 /etc/passwd` - 显示文件后几行 - `wc /etc/passwd` - 统计文件信息 - `wc -l /etc/passwd` - 统计文件的行数 - `wc -w /etc/passwd` - 统计文件的字数 - `wc -c /etc/passwd` - 统计文件的字节数 - `cat -n testfile.txt` - 显示文件内容和行号 - `tail -f test.log` - 实时跟踪文件更新 - `cat > newfile.txt << EOF` - 使用 cat 创建新文件 - `cat >> newfile.txt << EOF` - 使用 cat 追加内容到文件 #### Day 4-2: vi/vim 编辑器基础 - `vi filename` 或 `vim filename` - 打开文件 - `i` - 在光标前插入 - `a` - 在光标后追加 - `o` - 在下方新建一行并插入 - `Esc` - 退出插入模式 - `:w` - 保存文件 - `:w filename` - 另存为 filename - `:q` - 退出(未修改时) - `:q!` - 强制退出,不保存修改 - `:wq` - 保存并退出 - `:x` - 保存并退出(同 :wq) - `ZZ` - 保存并退出(普通模式下) - `h`, `j`, `k`, `l` - 向左、下、上、右移动 - `w`, `b`, `e` - 移动到单词开头、上一个单词开头、当前单词结尾 - `0`, `^`, `$` - 移动到行首、行首第一个非空字符、行尾 - `gg`, `G` - 移动到文件开头、文件结尾 - `:n` - 移动到第 n 行 - `x`, `X` - 删除光标处、前的字符 - `dw`, `dd`, `D` - 删除一个单词、一行、从光标到行尾 - `d$`, `d0` - 删除从光标到行尾、从行首到光标 - `yy`, `yw` - 复制当前行、复制一个单词 - `p`, `P` - 在光标后、前粘贴 - `u`, `U`, `Ctrl + r` - 撤销上一次操作、撤销对当前行的所有修改、重做撤销的操作 - `/pattern`, `?pattern` - 向下、向上搜索 - `n`, `N` - 跳转到下一个、上一个匹配 - `:s/old/new/` - 替换当前行第一个匹配 - `:s/old/new/g` - 替换当前行所有匹配 - `:%s/old/new/g` - 替换文件中所有匹配 - `:%s/old/new/gc` - 替换所有匹配,每次都确认 - `:n,ms/old/new/g` - 替换第 n 到 m 行的所有匹配 - `v`, `V`, `Ctrl + v` - 进入字符可视模式、行可视模式、块可视模式 - `:sp`, `:vsp` - 水平分屏、垂直分屏 - `Ctrl + w + h/j/k/l/q` - 移动到左/下/上/右窗口、关闭当前窗口 - `vimtutor` - 运行 vim 内置教程 #### Day 6: 文本搜索与查找 - `grep "root" /etc/passwd` - 在文件中搜索文本 - `grep -i "ROOT" /etc/passwd` - 忽略大小写搜索 - `grep -n "bash" /etc/passwd` - 显示匹配行的行号 - `grep -v "nologin" /etc/passwd` - 反向匹配(显示不匹配的行) - `grep -c "bash" /etc/passwd` - 只显示匹配的行数 - `grep -r "function" /usr/include/` - 递归搜索目录 - `grep -E "^r.*t$" /etc/passwd` - 使用正则表达式搜索 - `grep -w "root" /etc/passwd` - 匹配整个单词 - `grep --color=auto "bash" /etc/passwd` - 高亮显示匹配的文本 - `find /home -name "*.txt"` - 按名称查找文件 - `find . -type f -name "*.c"` - 查找特定类型的文件 - `find . -type d -name "test"` - 查找目录 - `find . -type f -size +1M` - 查找大于1MB的文件 - `find . -type f -mtime -7` - 查找7天内修改过的文件 - `find /home -user zhu -type f` - 查找特定用户的文件 - `find . -type f -perm 644` - 查找特定权限的文件 - `find . -type f -name "*.c" -exec grep -l "main" {} \;` - 使用 find 和 grep 组合 - `locate bash` - 快速查找文件 - `sudo updatedb` - 更新 locate 数据库 #### Day 7: 输入输出重定向 - `echo "Hello, World!" > output.txt` - 将标准输出重定向到文件(覆盖) - `echo "This is a new line" >> output.txt` - 将标准输出重定向到文件(追加) - `cat < input.txt` - 从文件读取输入 - `cat << 'EOF'` - 使用 Here Document - `cat <<< "This is a here string"` - 使用 Here String - `ls -l | head -n 5` - 使用管道符 - `ls /nonexistent 2> error.txt` - 重定向标准错误 - `ls /nonexistent /etc/hostname &> all_output.txt` - 将标准输出和标准错误都重定向 - `ls /nonexistent > /dev/null 2>&1` - 丢弃所有输出 - `ls /nonexistent 2>&1 | cat` - 将标准错误重定向到标准输出 - `echo "This will be displayed and saved" | tee tee_output.txt` - 使用 tee 命令 - `echo "Another line" | tee -a tee_output.txt` - 使用 tee 追加模式 ### Week 2: 进阶操作 #### Day 8: 文本处理工具 - `echo "Hello, World!" | sed 's/World/Linux/'` - 使用 sed 替换文本 - `echo -e "Line 1\nLine 2\nLine 3" | sed '2d'` - 使用 sed 删除行 - `echo -e "Line 1\nLine 2\nLine 3" | sed -n '2p'` - 使用 sed 打印特定行 - `echo "a a a" | sed 's/a/b/g'` - 使用 sed 全局替换 - `echo -e "Line 1\n\nLine 2\n\nLine 3" | sed '/^$/d'` - 使用 sed 删除空行 - `sed -i 's/Original/Modified/' test.txt` - 使用 sed 直接修改文件 - `echo "name age city" | awk '{print $1}'` - 使用 awk 打印字段 - `echo "John 25 NewYork" | awk '{print "Name:", $1, "Age:", $2, "City:", $3}'` - 使用 awk 处理多字段 - `echo -e "a b c\nd e f" | awk '{print "Line", NR, "has", NF, "fields"}'` - 使用 awk 内置变量 - `echo -e "10\n20\n30" | awk '$1 > 15 {print $1}'` - 使用 awk 进行条件判断 - `echo -e "10\n20\n30" | awk '{sum += $1} END {print sum}'` - 使用 awk 计算总和 - `echo "name:age:city" | awk -F: '{print $1, $2, $3}'` - 使用 awk 指定分隔符 - `echo "name,age,city" | cut -d, -f1,3` - 使用 cut 提取字段 - `echo "Hello" | cut -c1-3` - 使用 cut 按字符切割 - `echo -e "banana\napple\ncherry" | sort` - 使用 sort 排序 - `echo -e "10\n2\n30\n1" | sort -n` - 使用 sort 按数字排序 - `echo -e "10\n2\n30\n1" | sort -nr` - 使用 sort 反向排序 - `echo -e "apple\nbanana\napple\ncherry" | sort | uniq` - 使用 uniq 去除重复行 - `echo -e "apple\nbanana\napple\napple\ncherry" | sort | uniq -c` - 使用 uniq 统计重复次数 #### Day 9: 进程管理 - `ps aux` - 查看所有进程 - `ps -u $USER` - 查看特定用户的进程 - `ps -p $$` - 查看特定 PID 的进程 - `top` - 实时监控进程 - `ps --forest` - 以树形结构显示进程 - `sleep 100 &` - 启动后台进程 - `jobs -l` - 查看后台任务 - `fg %1` - 将后台任务调到前台 - `Ctrl+Z` - 暂停前台任务 - `bg %1` - 将任务放到后台运行 - `kill %1` - 终止进程 - `kill -9 %1` - 强制终止进程 - `killall sleep` - 按名称终止进程 - `nohup sleep 1000 > nohup.out 2>&1 &` - 使用 nohup 运行长时间任务 - `ps -ef | grep bash` - 查看进程的详细信息 - `pgrep bash` - 按名称查找进程 PID - `ps -o pid,ppid,cmd -p $$` - 查看进程的父进程 - `ps -o pid,ppid,%mem,%cpu,cmd -p $$` - 查看进程的资源使用 - `killall -9 sleep` - 终止所有同名进程 - `killall -i sleep` - 交互式终止进程 - `uptime` - 查看系统负载 #### Day 10: Shell 变量与环境 - `name="John"` - 定义变量 - `echo $name` - 使用变量 - `echo "Hello, $name!"` - 使用变量 - `echo "${filename}.txt"` - 使用花括号明确变量边界 - `env` - 查看所有环境变量 - `set` - 查看所有 Shell 变量 - `export MY_VAR="Hello"` - 导出环境变量 - `export NEW_VAR="World"` - 在一行中定义和导出变量 - `echo $HOME` - 查看特定环境变量 - `unset temp` - 删除变量 - `printenv HOME` - 查看特定环境变量 - `export PATH=$PATH:/new/path` - 设置 PATH 变量 - `echo "Script name: $0"` - 使用特殊变量 - `echo "First argument: $1"` - 使用位置参数 - `echo ${UNDEFINED_VAR:-"default value"}` - 设置变量的默认值 - `readonly READONLY_VAR="cannot change"` - 创建只读变量 - `readonly` - 查看只读变量 - `current_date=$(date)` - 使用命令替换设置变量 - `echo $((num1 + num2))` - 使用算术运算 #### Day 11: 条件判断与流程控制 - `if [ condition ]; then ... fi` - if-else 语句 - `if [ $num -lt 5 ]; then ... elif [ $num -lt 15 ]; then ... else ... fi` - if-elif-else 语句 - `[ "$str1" = "$str2" ]` - 字符串比较 - `[ -f "/etc/passwd" ]` - 文件存在性测试 - `[ -f "/etc/passwd" ] && [ -r "/etc/passwd" ]` - 使用逻辑与 - `[ -f "/etc/passwd" ] || [ -f "/etc/shadow" ]` - 使用逻辑或 - `[ ! -f "/nonexistent" ]` - 使用逻辑非 - `case $fruit in ... esac` - case 语句 - `[ -z "$empty_var" ]` - 检查变量是否为空 - `[ -n "$non_empty_var" ]` - 检查变量是否非空 - `[ $a -lt $b ]` - 数值比较 - `[[ "$name" == "John" ]]` - 使用 [[ ]] 进行字符串比较 - `grep -q "root" /etc/passwd` - 检查命令执行结果 - `[ $age -ge 18 ] && [ $age -le 30 ]` - 组合多个条件 #### Day 13: 循环结构 - `for i in 1 2 3 4 5; do ... done` - 简单的 for 循环 - `for i in {1..10}; do ... done` - 使用范围 - `for i in $(seq 1 10); do ... done` - 使用 seq 命令 - `for ((i=1; i<=10; i++)); do ... done` - C风格 for 循环 - `for file in *.md; do ... done` - 遍历文件 - `for fruit in "${fruits[@]}"; do ... done` - 遍历数组 - `break` - 跳出循环 - `continue` - 跳过当前迭代 - `while [ $count -le 5 ]; do ... done` - while 循环 - `until [ $count -gt 5 ]; do ... done` - until 循环 - `while read line; do ... done < test.txt` - 读取文件内容 - `for user in $(cut -d: -f1 /etc/passwd | head -n 5); do ... done` - 处理命令输出 - `for i in {1..3}; do for j in {1..3}; do ... done; done` - 嵌套循环 - `for i in {1..10}; do sum=$((sum + i)); done` - 计算总和 - `for dir in */; do ... done` - 遍历目录 - `while true; do ... break ... done` - 无限循环(使用 break 退出) - `for arg in "$@"; do ... done` - 使用命令行参数 - `for file in file*.txt; do mv "$file" "new_$file"; done` - 批量重命名文件 - `for file in /etc/passwd /etc/shadow /etc/hostname; do ... done` - 检查多个文件 - `for i in {1..5}; do mkdir -p "$dir"; done` - 创建多个目录 #### Day 14: 函数定义与调用 - `say_hello() { echo "Hello, World!"; }` - 定义和调用简单函数 - `greet() { echo "Hello, $1!"; }` - 带参数的函数 - `print_info() { echo "Name: $1"; echo "Age: $2"; echo "City: $3"; }` - 多个参数 - `check_number() { if [ $1 -gt 10 ]; then return 0; else return 1; fi }` - 使用返回值 - `add() { echo $(($1 + $2)); }` - 使用 echo 返回结果 - `test_scope() { local local_var="I am local"; global_var="I am global"; ... }` - 使用局部变量 - `sum_array() { local sum=0; for num in "$@"; do sum=$((sum + num)); done; echo $sum; }` - 计算数组的和 - `check_file() { if [ -f "$1" ]; then ... fi }` - 检查文件是否存在 - `create_dir() { if [ -d "$1" ]; then ... else mkdir -p "$1"; ... fi }` - 创建目录 - `rename_files() { for file in "$@"; do ... done }` - 批量重命名文件 - `factorial() { if [ $1 -le 1 ]; then echo 1; else local prev=$(factorial $(($1 - 1))); echo $(($1 * prev)); fi }` - 递归函数(计算阶乘) - `greet_with_default() { local name=${1:-"Guest"}; echo "Hello, $name!"; }` - 默认参数值 - `require_params() { if [ $# -lt 2 ]; then ... fi }` - 参数数量检查 - `process_array() { for item in "$@"; do ... done }` - 使用数组作为参数 - `get_stats() { local sum=0; local count=$#; for num in "$@"; do sum=$((sum + num)); done; echo "$sum $count"; }` - 函数返回多个值 - `safe_divide() { if [ $2 -eq 0 ]; then ... fi }` - 错误处理 - `log() { local level=$1; shift; local message="$@"; local timestamp=$(date "+%Y-%m-%d %H:%M:%S"); echo "[$timestamp] [$level] $message"; }` - 日志函数 - `read_config() { local file=$1; local key=$2; if [ -f "$file" ]; then grep "^${key}=" "$file" | cut -d'=' -f2; fi }` - 配置读取函数 - `show_progress() { local current=$1; local total=$2; local percent=$((current * 100 / total)); ... }` - 进度显示函数 - `validate_email() { local email=$1; if [[ "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then ... fi }` - 验证函数 ### Week 3: 脚本编程 #### Day 15: Shell 脚本基础 - `#!/bin/bash` - Shebang - `chmod +x script.sh` - 添加执行权限 - `./script.sh` - 直接执行 - `bash script.sh` - 使用 bash 执行 - `source script.sh` 或 `. script.sh` - 使用 source 执行 - `set -x` - 启用调试模式 - `set +x` - 禁用调试模式 - `set -e` - 遇到错误立即退出 - `set -u` - 使用未定义变量时报错 - `set -o pipefail` - 管道中任何命令失败都返回错误 - `bash -n script.sh` - 检查语法错误 - `bash -x script.sh` - 调试模式运行脚本 - `bash -v script.sh` - 显示输入的命令 - `cat -A script.sh` - 使用 cat -A 查看脚本的特殊字符 #### Day 16: 命令行参数处理 - `$0` - 脚本名称 - `$1`, `$2`, `$3-$9`, `${10}` - 位置参数 - `$#` - 参数个数 - `$@` - 所有参数(作为独立的字符串) - `$*` - 所有参数(作为单个字符串) - `$$` - 当前脚本的 PID - `$!` - 最后一个后台进程的 PID - `$?` - 上一个命令的退出状态 - `shift` - 移动位置参数 - `${parameter:-default}` - 设置默认参数值 - `getopts "vf:" opt; do case $opt in ... esac; done` - getopts 命令 - `for arg in "$@"; do echo "Argument: $arg"; done` - 处理带空格的参数 - `args=("$@")` - 使用数组处理参数 - `is_number() { local num=$1; local regex='^[0-9]+$'; if [[ $num =~ $regex ]]; then ... fi }` - 检查参数是否为数字 - `show_help() { ... }` - 创建帮助信息 - `while getopts "vi:o:" opt; do ... done` - 处理多个选项和参数 #### Day 17: 数组操作 - `fruits=("apple" "banana" "cherry")` - 定义数组 - `array[0]=item1` - 逐个赋值 - `array=($(command))` - 从命令输出创建 - `${fruits[0]}` - 访问第一个元素 - `${#fruits[@]}` - 获取数组长度 - `${fruits[@]}` - 访问所有元素 - `fruits+=("cherry")` - 添加元素 - `unset fruits[1]` - 删除元素 - `${numbers[@]:0:3}` - 数组切片 - `${files[@]/txt/md}` - 数组替换 - `users=($(cut -d: -f1 /etc/passwd | head -n 5))` - 从命令输出创建数组 - `contains_element() { ... }` - 检查数组是否包含元素 - `sorted=($(echo "${numbers[@]}" | tr ' ' '\n' | sort -n | tr '\n' ' '))` - 数组排序 - `unique=($(echo "${numbers[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))` - 数组去重 - `for num in "${numbers[@]}"; do sum=$((sum + num)); done` - 计算数组元素的和 - `declare -A person` - 关联数组 - `person[name]="John"` - 关联数组赋值 - `for key in "${!person[@]}"; do ... done` - 遍历关联数组 - `mapfile -t lines < data.txt` - 从文件读取到数组 #### Day 18: 字符串处理 - `str1='Hello, World!'` - 单引号定义 - `str2="Hello, $USER!"` - 双引号定义 - `str3=Hello` - 无引号定义 - `${#str}` - 获取字符串长度 - `str3="$str1, $str2!"` - 字符串拼接 - `${str:0:5}` - 字符串截取 - `${str/World/Linux}` - 字符串替换(第一个匹配) - `${str//l/L}` - 字符串替换(所有匹配) - `${str#Hello}` - 删除前缀 - `${str##*World}` - 删除前缀(最长匹配) - `${str%, World!}` - 删除后缀 - `${str%%,*}` - 删除后缀(最长匹配) - `[[ $str == *"World"* ]]` - 字符串查找 - `[ "$str1" = "$str2" ]` - 字符串比较 - `${str^^}` - 转换为大写 - `${str,,}` - 转换为小写 - `[ -z "$str1" ]` - 检查字符串是否为空 - `[ -n "$str2" ]` - 检查字符串是否非空 - `IFS=',' read -ra fruits <<< "$str"` - 分割字符串 - `filename=$(basename "$filepath")` - 提取文件名 - `extension="${filename##*.}"` - 提取扩展名 - `name="${filename%.*}"` - 提取文件名(不含扩展名) - `reversed=$(echo "$str" | rev)` - 反转字符串 - `count=$(echo "$str" | tr -cd 'l' | wc -c)` - 统计字符出现次数 - `is_number() { local str=$1; local regex='^[0-9]+$'; if [[ $str =~ $regex ]]; then ... fi }` - 检查字符串是否为数字 - `while IFS='=' read -r key value; do ... done < config.ini` - 解析配置文件 #### Day 20: 错误处理与调试 - `echo $?` - 查看命令的退出状态 - `set -e` - 遇到错误立即退出 - `set -u` - 使用未定义变量时报错 - `set -x` - 启用调试模式 - `set +e` - 禁用错误退出 - `set +u` - 禁用未定义变量检查 - `set +x` - 禁用调试模式 - `set -o pipefail` - 管道错误处理 - `ls /etc/passwd && echo "Success"` - 使用 && 操作符 - `ls /nonexistent || echo "Failed"` - 使用 || 操作符 - `trap cleanup EXIT` - 捕获 EXIT 信号 - `trap 'handle_error $LINENO' ERR` - 捕获 ERR 信号 - `trap handle_interrupt INT` - 捕获 INT 信号 - `error_exit() { echo "Error: $1" >&2; exit "${2:-1}"; }` - 自定义错误处理函数 - `bash -n script.sh` - 检查语法 - `bash -x script.sh` - 调试模式 - `bash -v script.sh` - 显示输入命令 - `temp_file=$(mktemp)` - 使用临时文件 - `ls /nonexistent 2> error.log` - 错误重定向 - `ls /etc/passwd /nonexistent &> all.log` - 混合重定向 ### Week 4: 实战与总结 #### Day 21: 实战项目启动 - `source "$PROJECT_DIR/lib/utils.sh"` - 加载库文件 - `load_config "$CONFIG_FILE"` - 加载配置 - `init_log "$LOG_FILE"` - 初始化日志 - `log() { local level=$1; shift; local message="$@"; local timestamp=$(date "+%Y-%m-%d %H:%M:%S"); echo "[$timestamp] [$level] $message" | tee -a "$LOG_FILE"; }` - 日志函数 - `ensure_dir()` - 确保目录存在 - `format_number()` - 格式化数字 - `format_bytes()` - 格式化字节 - `monitor_system()` - 监控系统 - `check_system_alerts()` - 检查系统告警 #### Day 22: 实战项目开发(第一天) - `generate_report()` - 生成系统报告 - `check_alerts()` - 检查告警 - `send_email_alert()` - 发送邮件告警 - `send_system_alert()` - 发送系统告警 - `log_alert()` - 记录告警到日志 - `check_alert_history()` - 检查告警历史 - `cleanup_old_reports()` - 清理旧报告 - `cleanup_old_logs()` - 清理旧日志 - `cleanup_temp_files()` - 清理临时文件 - `cleanup_all()` - 执行所有清理 - `start_daemon()` - 启动守护进程 - `stop_daemon()` - 停止守护进程 - `status_daemon()` - 查看状态 #### Day 23: 实战项目开发(第二天) - `show_config()` - 显示当前配置 - `update_config()` - 更新配置 - `delete_config()` - 删除配置 - `validate_config()` - 验证配置 - `backup_config()` - 备份配置 - `restore_config()` - 恢复配置 - `list_backups()` - 列出备份 - `reset_config()` - 重置为默认配置 - `generate_ascii_chart()` - 生成 ASCII 图表 - `generate_cpu_chart()` - 生成 CPU 使用率图表 - `generate_memory_chart()` - 生成内存使用率图表 - `generate_disk_chart()` - 生成磁盘使用率图表 - `generate_process_chart()` - 生成进程资源使用图表 - `generate_dashboard()` - 生成综合监控仪表板 - `optimize_disk_io()` - 优化磁盘 I/O - `optimize_memory()` - 优化内存使用 - `optimize_cpu()` - 优化 CPU 使用 - `optimize_network()` - 优化网络性能 - `generate_performance_report()` - 生成性能报告 #### Day 24: 高级主题 - `grep -E '^a' regex_test.txt` - 匹配以 a 开头的单词 - `grep -E 'e$' regex_test.txt` - 匹配以 e 结尾的单词 - `grep -E '[0-9]' regex_test.txt` - 匹配包含数字的行 - `grep -E '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' regex_test.txt` - 匹配邮箱地址 - `grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' regex_test.txt` - 匹配 IP 地址 - `grep -E 'https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' regex_test.txt` - 匹配 URL - `validate_email()` - 验证邮箱地址 - `validate_ip()` - 验证 IP 地址 - `validate_url()` - 验证 URL - `extract_info()` - 提取信息 - `crontab -l` - 查看 crontab - `crontab -e` - 编辑 crontab - `set -euo pipefail` - 设置严格模式 - `declare -A config` - 关联数组 - `diff <(sort file1.txt) <(sort file2.txt)` - 进程替换 - `current_date=$(date +%Y-%m-%d)` - 命令替换 - `result=$((10 + 20))` - 算术运算 - `pi=$(echo "scale=10; 4*a(1)" | bc -l)` - 浮点数运算 - `read sum count < <(get_stats 1 2 3 4 5)` - 函数返回多个值 - `mapfile -t lines < file.txt` - 使用 mapfile 处理文件 - `select option in "Option 1" "Option 2" "Option 3" "Quit"; do ... done` - 使用 select 创建菜单 - `cat << 'EOF'` - 使用 here document - `grep "pattern" <<< "This is a here string"` - 使用 here string - `filename="document.pdf"` - 使用参数扩展 - `(cd /tmp && ls)` - 使用子 Shell - `coproc tail -f /var/log/syslog` - 使用 coproc 进行进程间通信 #### Day 25: 实战项目优化 - `cached_get_cpu_usage()` - 带缓存的函数 - `batch_process()` - 批量操作优化 - `parallel_process()` - 并行处理 - `optimized_file_check()` - 减少系统调用 - `optimize_commands()` - 使用内置命令代替外部命令 - `memory_optimization()` - 内存优化 - `io_optimization()` - I/O 优化 - `network_optimization()` - 网络优化 - `record_history()` - 历史数据记录 - `analyze_history()` - 历史数据分析 - `predict_trend()` - 趋势预测 - `detect_anomaly()` - 异常检测 - `auto_respond()` - 自动化响应 - `integrated_monitor()` - 集成监控 #### Day 26: 阶段性检查 - 项目完成 - `./test_suite.sh` - 运行测试套件 - `./test_performance.sh` - 运行性能测试 - `./test_functionality.sh` - 运行功能测试 - `./install.sh` - 安装脚本 - `./uninstall.sh` - 卸载脚本 - `./final_verification.sh` - 最终验证 - `tar -czf monitor_tool-2.0.0.tar.gz monitor_tool/` - 创建发布包 - `sha256sum monitor_tool-2.0.0.tar.gz > monitor_tool-2.0.0.tar.gz.sha256` - 计算校验和 #### Day 27: 知识梳理与总结 - `tree monitor_tool` - 查看项目结构 - `find monitor_tool -type f | sort` - 查找所有文件 - `wc -l bin/*.sh lib/*.sh` - 统计代码行数 - `du -sh .` - 查看项目大小 - `ls -lh reports/` - 查看报告文件 - `cat logs/monitor.log` - 查看日志文件 #### Day 28: 最终检查与展望 - `bash -n script.sh` - 检查脚本语法 - `bash -x script.sh` - 调试模式运行脚本 - `find . -name "*.md" -type f | sort` - 查找所有 Markdown 文件 - `ls -lh *.md docs/*.md` - 查看所有文档文件 --- ## 学习资源 - 在线文档:man pages - 练习平台:Linux 系统 - 参考书籍:《Linux命令行与Shell脚本编程大全》 - 社区支持:Stack Overflow, GitHub ## 学习建议 1. **定期复习**: 每天学完新知识后,花10-15分钟复习之前的内容 2. **多做练习**: 不要只是看教程,要动手操作每个命令 3. **记录笔记**: 记录常用命令的用法和遇到的问题 4. **探索发现**: 尝试使用命令的不同选项,了解更多功能 5. **实际应用**: 尝试用学到的命令完成日常任务 ## 项目总结 通过这28天的学习,我们掌握了: 1. ✅ Shell 基础概念和配置 2. ✅ 文件系统导航 3. ✅ 文件操作基础 4. ✅ 文件内容查看 5. ✅ 文本搜索与查找 6. ✅ 输入输出重定向 7. ✅ 文本处理工具 8. ✅ 进程管理 9. ✅ Shell 变量与环境 10. ✅ 条件判断与流程控制 11. ✅ 循环结构 12. ✅ 函数定义与调用 13. ✅ Shell 脚本基础 14. ✅ 命令行参数处理 15. ✅ 数组操作 16. ✅ 字符串处理 17. ✅ 错误处理与调试 18. ✅ 实战项目开发 19. ✅ 高级主题 20. ✅ 项目优化和发布 这些知识将帮助我们成为一名合格的 Linux 系统管理员和 Shell 脚本开发者。继续加油!