Bash 基础与进阶实践指南

目录

  1. [Bash 简介与基础](#Bash 简介与基础)
  2. 基本命令与文件操作
  3. 权限管理与用户管理
  4. 重定向与管道
  5. 变量与环境变量
  6. 通配符与正则表达式
  7. [Shell 脚本结构与控制流](#Shell 脚本结构与控制流)
  8. 常用内建命令与技巧
  9. 文本处理常用命令
  10. 作业控制与进程管理
  11. 别名与函数
  12. 实用技巧与注意事项
  13. [更多 Bash 进阶话题](#更多 Bash 进阶话题)
  14. 参考资源

1. Bash 简介与基础

1.1 什么是 Bash

  • Bash(Bourne-Again SHell):一种常见的 Unix/Linux Shell(命令解释器),也是在大多数 Linux 发行版中的默认 Shell。
  • Shell 的作用:提供命令执行与脚本编写环境,是用户与操作系统内核交互的接口。

1.2 如何进入 Bash

  • 登录终端 后默认即进入 Bash。如果使用的是其他 Shell(如 zsh),可输入 bash 切换到 Bash。

  • 查看当前 Shell:

    bash 复制代码
    echo $SHELL

1.3 Bash 的主要特点

  • 强大的 命令行交互:组合、重定向、管道操作非常灵活。
  • 支持 脚本编写 :可以编写 .sh 文件并运行。
  • 易于与其他命令结合,具有丰富的内置功能。

2. 基本命令与文件操作

2.1 查看当前目录与切换目录

  • 查看当前所在目录:

    bash 复制代码
    pwd
  • 切换目录:

    bash 复制代码
    cd /path/to/directory

2.2 列出文件

  • 列出文件和目录 (简洁列表):

    bash 复制代码
    ls
  • 查看详情(权限、大小、修改时间等):

    bash 复制代码
    ls -l
  • 显示隐藏文件:

    bash 复制代码
    ls -a

2.3 创建、删除、复制、移动

  • 创建文件 (空文件):

    bash 复制代码
    touch filename
  • 创建目录

    bash 复制代码
    mkdir directory_name
  • 删除文件

    bash 复制代码
    rm filename
  • 删除目录

    bash 复制代码
    rm -r directory_name
  • 复制文件

    bash 复制代码
    cp source_file target_file
  • 移动/重命名文件

    bash 复制代码
    mv old_name new_name

2.4 查看文件内容

  • cat :一次性显示整个文件

    bash 复制代码
    cat file.txt
  • less :分页查看文件(q 退出)

    bash 复制代码
    less file.txt
  • head/tail :只看开头/结尾 N 行

    bash 复制代码
    head -n 10 file.txt
    tail -n 10 file.txt
  • tail -f file.txt:实时查看文件增长(常用于查看日志)

2.5 搜索文件

  • find :在指定路径下查找文件

    bash 复制代码
    find /path -name "*.sh"

    常与 xargs-exec 搭配使用做批量操作:

    bash 复制代码
    find /path -type f -name "*.log" -exec rm {} \;

3. 权限管理与用户管理

3.1 文件权限

  • Unix/Linux 的文件权限通常分为:所有者(user)组(group)其他人(others) 三类。

  • 每一类权限有三个维度:读(r)写(w)执行(x)

  • 查看权限:

    bash 复制代码
    ls -l

    例如:-rwxr-xr-- 表示所有者有 rwx 权限,组用户有 r-x 权限,其他人有 r-- 权限。

3.2 修改权限

  • 使用 chmod 修改权限(符号模式或数字模式):

    bash 复制代码
    chmod u=rwx,g=rx,o=r file.sh
    chmod 755 file.sh

3.3 修改文件拥有者

  • chown :修改文件/目录所有者或所属组

    bash 复制代码
    chown user file.txt
    chown user:group file.txt

3.4 切换用户

  • 从当前用户切换到其他用户:

    bash 复制代码
    su - other_user
  • 使用超级管理员权限(若当前用户在 sudoers 列表中):

    bash 复制代码
    sudo command

4. 重定向与管道

4.1 标准输入输出和错误输出

  • 文件描述符
    • stdin:标准输入(文件描述符 0)
    • stdout:标准输出(文件描述符 1)
    • stderr:标准错误输出(文件描述符 2)

4.2 重定向

  • 重定向输出到文件 (覆盖原文件):

    bash 复制代码
    command > file.txt
  • 追加输出到文件

    bash 复制代码
    command >> file.txt
  • 重定向错误输出

    bash 复制代码
    command 2> error.log
    command 2>> error.log
  • 同时重定向标准输出和错误输出

    bash 复制代码
    command > all.log 2>&1

4.3 管道

  • 管道操作符 | :将左边命令的标准输出作为右边命令的标准输入。

    bash 复制代码
    command1 | command2

    常用示例:

    bash 复制代码
    ls -l | grep ".sh"

4.4 Here Document 与 Here String

  • Here Document :将多个行的文本作为输入传递给命令

    bash 复制代码
    cat << EOF > file.txt
    line1
    line2
    EOF

    EOF 可以改为任意标记,结束符前不能有多余空格。

  • Here String :将一小段字符串作为输入

    bash 复制代码
    grep "pattern" <<< "this is a test"

5. 变量与环境变量

5.1 变量的定义与使用

  • 定义变量

    bash 复制代码
    NAME="Alice"
    echo $NAME
  • 注意 :等号两边不能有空格;要引用变量使用 echo $变量名${变量名}

5.2 环境变量

  • 常见环境变量

    • $HOME:用户主目录
    • $PATH:可执行文件搜索路径
    • $PWD:当前工作目录
    • $SHELL:当前 Shell 路径
  • 导出环境变量

    bash 复制代码
    export VARIABLE="value"
  • 查看环境变量

    bash 复制代码
    env
    printenv

5.3 位置参数变量

  • 脚本中的位置参数
    • $0:脚本自身的名字
    • $1$9:传递给脚本的参数
    • $#:传递给脚本的参数总个数
    • $@:传递给脚本的所有参数
    • $?:上一条命令的退出状态(0 表示成功,非 0 表示失败)

5.4 数组与关联数组(简单介绍)

  • 普通数组

    bash 复制代码
    myarr=(apple banana cherry)
    echo ${myarr[0]}    # apple
    echo ${myarr[@]}    # apple banana cherry
  • 关联数组 (Bash 4+ 支持):

    bash 复制代码
    declare -A mymap
    mymap[color]="blue"
    mymap[fruit]="apple"
    echo ${mymap[color]}  # blue

6. 通配符与正则表达式

6.1 通配符(Globbing)

  • *:匹配任意长度的任意字符(包括空字符)
  • ?:匹配单个任意字符
  • [ ]:匹配中括号内任意单个字符
    例如 ls *.sh:匹配当前目录下所有以 .sh 结尾的文件。

6.2 正则表达式(Regular Expressions)

  • 通常结合 grepsedawk 等命令使用,用于复杂的文本匹配。
  • 常见元字符:
    • ^:匹配行首
    • $:匹配行尾
    • .:匹配除换行符以外的任何字符
    • *:匹配前一个字符的 0 次或多次出现
    • [...]:匹配方括号内的任意一个字符
    • ( ):分组
  • 注意:通配符与正则表达式的语法/使用场景并不完全相同,需要区分。

7. Shell 脚本结构与控制流

7.1 脚本的基本结构

  • 脚本头行(Shebang) :指定解释器

    bash 复制代码
    #!/usr/bin/env bash
  • 注释 :使用 #

  • 执行权限 :要让脚本具有可执行权限

    bash 复制代码
    chmod +x script.sh
  • 运行脚本

    bash 复制代码
    ./script.sh

    或在当前 Shell 中执行:

    bash 复制代码
    source script.sh
    # 或 . script.sh

7.2 条件判断

  • if 语句

    bash 复制代码
    if [ condition ]; then
        # ...
    elif [ condition2 ]; then
        # ...
    else
        # ...
    fi
  • test 命令 或者 单中括号 [ ]:进行数值、字符串、文件检测,比如

    bash 复制代码
    [ -f file ]      # 是否是一个普通文件
    [ -d directory ] # 是否是一个目录
    [ "$VAR" = "abc" ] # 字符串是否相等
    [ "$NUM" -eq 10 ]  # 数值是否等于 10
  • 双中括号 [[ ]]:Bash 的扩展测试语句,支持更多模式匹配等高级特性。

7.3 循环

  • for 循环

    bash 复制代码
    for var in item1 item2 item3
    do
        echo $var
    done
  • while 循环

    bash 复制代码
    while [ condition ]
    do
        # ...
    done
  • until 循环

    bash 复制代码
    until [ condition ]
    do
        # ...
    done

7.4 case 语句

bash 复制代码
case $variable in
  pattern1)
    # ...
    ;;
  pattern2)
    # ...
    ;;
  *)
    # 默认匹配
    ;;
esac

7.5 常用扩展

  • 命令替换

    bash 复制代码
    result=$(command) 
    # 或者老式用法: result=`command`
  • 算术扩展

    bash 复制代码
    num1=10
    num2=5
    echo $((num1 + num2))  # 15
  • 花括号扩展

    bash 复制代码
    echo {1..5}    # 1 2 3 4 5
    echo file{A,B,C}.txt  # fileA.txt fileB.txt fileC.txt

8. 常用内建命令与技巧

8.1 type/which

  • 查看命令是内置(builtin)还是外部可执行文件:

    bash 复制代码
    type cd
    type ls
  • 查看可执行文件路径:

    bash 复制代码
    which ls

8.2 history

  • 查看和管理历史命令:

    bash 复制代码
    history
  • 执行第 N 条历史命令:

    bash 复制代码
    !N
  • 搜索历史:按 Ctrl + r,然后输入关键字

8.3 echo/printf

  • echo:输出文本,自动换行
  • printf:功能类似 C 语言的 printf,可格式化输出

8.4 read

  • 交互式读取用户输入:

    bash 复制代码
    read -p "Enter your name: " NAME
    echo "Hello, $NAME"
  • read 常用选项:

    • -r:禁止反斜杠转义
    • -t <秒>:设置等待输入的超时时间

8.5 引号与转义

  • 单引号 ' ':原样输出,引号内所有字符都被视为普通字符
  • 双引号 " ":可以进行变量替换和命令替换
  • 反斜杠 \ :转义下一字符

9. 文本处理常用命令

9.1 grep

  • 在文本中搜索匹配的行:

    bash 复制代码
    grep "pattern" file.txt
  • 结合正则表达式:

    bash 复制代码
    grep -E "reg(pattern)+" file.txt
  • 常用选项:

    • -i:忽略大小写
    • -n:显示行号
    • -v:显示不匹配的行

9.2 sed

  • 流编辑器 ,可进行文本替换、插入、删除等:

    bash 复制代码
    sed 's/old/new/g' file.txt
  • -i 选项可以直接修改文件:

    bash 复制代码
    sed -i 's/old/new/g' file.txt

9.3 awk

  • 强大的文本处理工具,可按列进行分析:

    bash 复制代码
    awk '{print $1, $3}' file.txt
  • 支持复杂脚本逻辑,可以根据分隔符处理 CSV 等格式。关键字段:

    • $0:当前行全部内容
    • $1:第一列 ... $NF:最后一列
    • NR:当前行号
    • FS:输入分隔符

9.4 sort、uniq、cut、paste、xargs、tee

  • sort :排序

    bash 复制代码
    sort file.txt
  • uniq :去重(需先 sort)

    bash 复制代码
    sort file.txt | uniq
  • cut :切割某几列

    bash 复制代码
    cut -d ',' -f 1,3 file.csv
  • paste:将多文件按行合并

  • xargs :将标准输入的输出拼接成命令参数

    bash 复制代码
    find . -name "*.txt" | xargs rm
  • tee :将输入同时写入文件和标准输出

    bash 复制代码
    command | tee output.txt

10. 作业控制与进程管理

10.1 后台运行

  • 在命令末尾加 &,使其在后台运行:

    bash 复制代码
    long_running_command &
  • 查看后台作业:

    bash 复制代码
    jobs

10.2 前后台切换

  • 暂停前台作业Ctrl + Z
  • 将暂停的作业放到后台bg %job_number
  • 恢复后台作业到前台fg %job_number

10.3 进程管理

  • ps :列出当前进程

    bash 复制代码
    ps aux
  • top/htop:动态查看进程状态

  • kill :结束进程

    bash 复制代码
    kill -9 PID

11. 别名与函数

11.1 别名(alias)

  • 临时设置别名:

    bash 复制代码
    alias ll='ls -l'
  • ~/.bashrc 中设置长期别名,加入:

    bash 复制代码
    alias ll='ls -l --color=auto'

11.2 函数(function)

  • 在脚本或命令行定义函数:

    bash 复制代码
    myfunc() {
        echo "This is my function."
    }
  • 调用函数:

    bash 复制代码
    myfunc
  • 在函数内使用局部变量可用 local 关键字:

    bash 复制代码
    myfunc() {
        local var="local_value"
        echo "$var"
    }

12. 实用技巧与注意事项

  1. Tab 补全 :在命令行输入部分命令或文件名后按 Tab 可自动补全。
  2. 通配符谨慎使用 :如 rm -rf *;需非常小心,以防误删重要文件。
  3. Shell 脚本调试
    • bash -x script.sh:打印执行过程(追踪每一条命令)
    • bash -n script.sh:只做语法检查,不执行脚本
    • 在脚本顶部加入 set -x 或手动添加 set -eset -uset -o pipefail 等,以控制脚本在出错或使用未定义变量时及时退出。
  4. 查看命令帮助
    • 内部命令使用 help command
    • 外部命令使用 command --helpman command
  5. PS1 自定义 :在 ~/.bashrc 中可自定义 PS1 来定制命令行提示符(颜色、显示 Git 分支等)。
  6. 区分登录 Shell 与非登录 Shell :常见的启动文件有 .bash_profile.bashrc.profile 等,具体加载顺序略有差异。
  7. 使用 shellcheck:对脚本做静态分析,排查常见错误和风格问题。

13. 更多 Bash 进阶话题

以下内容更偏进阶或对复杂场景十分有用,可在掌握基础后逐步学习:

  1. 定时任务 :使用 cron(编辑 crontab -e)或 at 命令进行定时或一次性任务调度。
  2. 函数库与脚本组织 :将常用函数抽取为脚本,使用 source (或 .) 引用。
  3. shopt 与 Shell 选项 :比如 shopt -s expand_aliases 等,可开启或关闭 Bash 的一些特性。
  4. 信号处理(trap) :在脚本里捕获 SIGINT (Ctrl+C) 等信号并做相应处理。
  5. 正则高级用法 :POSIX ERE 与 PCRE 的差异、利用 grep -P 等。
  6. 多进程/并发:用子 Shell、GNU Parallel 等方式提升脚本并发能力。

14. 参考资源

  1. GNU Bash 官方文档
  2. The Linux Documentation Project (TLDP)
  3. Bash Scripting Tutorial (ABS Guide)
  4. shellcheck - Shell 脚本静态分析工具
相关推荐
孤独得猿1 小时前
[linux复习]——多线程
java·linux·jvm
小灿同学啊2 小时前
vmware虚拟机上Ubuntu或者其他系统无法联网的解决方法
linux·ubuntu
假如我年华正好2 小时前
【教程】MacBook 安装 VSCode 并连接远程服务器
linux·服务器·ide·vscode·ssh·macbook
wodeshijiexialey2 小时前
Linux系统(Ubuntu和树莓派)的远程操作练习
linux·运维·ubuntu
还没想好取啥名2 小时前
Linux网络编程(十六)——多线程服务器端的实现
linux·服务器·网络
龙哥·三年风水4 小时前
ubuntu18-nginx-二进制安装
linux·nginx·ubuntu
ToreanonyTang5 小时前
数据库中的数组: MySQL与StarRocks的数组操作解析
linux·运维·数据库·mysql
南棱笑笑生5 小时前
20250408在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统时拿掉经常出现的list-iodomain.sh警告信息
linux·运维·服务器
运维李哥不背锅9 小时前
K8S集群节点负载无故飙升:CPU软死锁解决方案
linux·运维
佟晖10 小时前
KGDB调试Linux内核与模块
linux·系统编程