《GNU/Linux Shell命令全解析》

news/2025/2/24 8:10:00

前言:

       Shell(如Bash、Zsh)是一个用户应用程序,通过系统调用接口与内核空间进行交互,运行在所示位置在用户空间中。

        GNU/Linux内核架构简易图:

1.基础命令行操作

1.1 Shell功能定义

  • 命令行解释器:Shell解释用户输入的命令,并执行相应的操作。
  • 脚本执行:Shell可以执行Shell脚本文件,这些脚本文件包含一系列命令。
  • 系统调用:Shell通过系统调用与内核空间进行交互,例如打开文件、读取文件、执行程序等。
  • 环境变量:Shell管理环境变量,这些变量可以被用户空间中的其他应用程序使用。
  • 进程管理:Shell可以启动、停止和管理用户空间中的进程。
  • 常见的Shell类型:Bash(Linux标准默认)、Zsh、Ksh、Sh等。
  • 如何打开终端
    • GNOME桌面环境:通常可以在应用菜单中找到“终端”选项来打开终端。
    • KDE桌面环境:在菜单中寻找类似“系统工具”或“终端”的选项来打开终端。此外,在很多Linux系统中,也可以使用快捷键(如Ctrl+Alt+T)打开终端。

1.2 shell基本命令格式和选项

  • 命令的基本结构

command [options] [arguments]

# command:要执行的命令名称。

# options:可选参数,用于修改命令的行为。

# arguments:命令操作的对象或参数。
  • 代码示例:
ls -l /home/user

# ls:命令,用于列出目录内容。
# -l:选项,以长格式显示目录内容。
# /home/user:参数,指定要列出内容的目录。
# 注意事项:
# 命令、选项和参数之间通常用空格分隔。
# 选项和参数的顺序可能会影响命令的执行结果,具体取决于命令的设计。
# 有些命令可能不需要选项或参数,而有些命令可能需要多个选项和参数。
# 通过这种基本格式,用户可以灵活地组合命令、选项和参数,以实现各种不同的操作和功能。

    1.3shell常用操作指令

            常用操作如下图所示:

    1.4Linux快捷键

            为了更好的在linux操作系统运行,在这就简单说下linux的常用命令,如下所示:

    2.文件和目录操作

            需要注意这里的文件和目录操要分开理解,不然容易混淆,操作指令如下图所示:

    2.1 文件的基本命令

    2.1.1创建文件

    • touch:用于创建一个新的空文件。

      touch filename
      

    2.1.2查看文件内容

    • cat:用于查看文件的内容。

      bash

      cat filename
      
    • less:用于分页查看文件内容,支持上下滚动。

      bash

      less filename
      
    • head:用于查看文件的前几行内容。

      bash

      head -n 5 filename  # 查看文件的前5行
      
    • tail:用于查看文件的后几行内容。

      bash

      tail -n 5 filename  # 查看文件的后5行
      

    2.1.3编辑文件

    • nano:一个简单易用的文本编辑器。

      bash

      nano filename
      
    • vim:一个功能强大的文本编辑器,需要一定的学习成本。

      bash

      vim filename
      

    2.1.4复制文件

    • cp:用于复制文件。

      bash

      cp source_file destination_file
      
    • cp -r:用于复制目录及其内容。

      bash

      cp -r source_directory destination_directory
      

    2.1.5 移动文件

    • mv:用于移动文件或重命名文件。

      bash

      mv source_file destination_file
      

    2.1.6删除文件

    • rm:用于删除文件。

      bash

      rm filename
      
    • rm -r:用于删除目录及其内容。

      bash

      rm -r directory_name
      

    2.1.7文件权限

    • chmod:用于修改文件或目录的权限。

      bash

      chmod 755 filename  # 设置文件权限为rwxr-xr-x
      
    • chown:用于修改文件或目录的所有者。

      bash

      chown user:group filename  # 设置文件的所有者为user,所属组为group
      

    2.1.8文件查找

    • find:用于在指定目录下查找文件。

      bash

      find /path/to/search -name "filename"
      

    2.1.9文件比较

    • diff:用于比较两个文件的差异。

      bash

      diff file1 file2
      

    2.1.10文件链接

    • ln:用于创建文件的硬链接或软链接。

      bash

      ln source_file link_name  # 创建硬链接
      ln -s source_file link_name  # 创建软链接
      

    2.2 目录的基本命令

    2.2.1创建目录

    • mkdir:用于创建一个新的目录。

      bash

      mkdir directory_name
      

    2.2.2查看目录内容

    • ls:用于列出目录中的文件和子目录。

      bash

      ls directory_name
      
    • ls -l:以长格式列出目录中的文件和子目录,包括文件权限、所有者、大小等详细信息。

      bash

      ls -l directory_name
      
    • ls -a:列出目录中的所有文件和子目录,包括隐藏文件(以.开头的文件)。

      bash

      ls -a directory_name
      

    2.2.3切换目录

    • cd:用于切换当前工作目录。

      bash

      cd directory_name
      
    • cd ..:切换到上一级目录。

      bash

      cd ..
      
    • cd ~:切换到当前用户的主目录。

      bash

      cd ~
      

    2.2.4复制目录

    • cp -r:用于复制目录及其内容。

      bash

      cp -r source_directory destination_directory
      

    2.2.5移动目录

    • mv:用于移动目录或重命名目录。

      bash

      bash

      mv source_directory destination_directory
      

    2.2.6删除目录

    • rm -r:用于删除目录及其内容。

      bash

      rm -r directory_name
      

    2.2.7目录权限

    • chmod:用于修改目录的权限。

      bash

      chmod 755 directory_name  # 设置目录权限为rwxr-xr-x
      
    • chown:用于修改目录的所有者。

      bash

      chown user:group directory_name  # 设置目录的所有者为user,所属组为group
      

    2.2.8目录查找

    • find:用于在指定目录下查找目录。

      bash

      find /path/to/search -type d -name "directory_name"
      

    2.2.9目录大小

    • du:用于查看目录的大小。

      bash

      du -sh directory_name  # 以人类可读的格式显示目录大小
      

    这些命令是Linux环境中目录操作的基础,掌握它们可以帮助你更高效地管理目录。

    3.系统信息和管理

            操作指令如下图所示:

    3.1查看系统信息

    • uname:用于显示系统信息。

      bash

      uname -a  # 显示所有系统信息
      
    • hostname:用于显示或设置系统的主机名。

      bash

      hostname  # 显示当前主机名
      
    • uptime:用于显示系统运行时间和平均负载。

      bash

      uptime
      
    • df:用于显示文件系统的磁盘空间使用情况。

      bash

      df -h  # 以人类可读的格式显示磁盘空间使用情况
      
    • free:用于显示系统内存使用情况。

      bash

      free -h  # 以人类可读的格式显示内存使用情况
      

    3.2管理用户权限

    • chmod:用于修改文件或目录的权限。

      bash

      chmod 755 filename  # 设置文件权限为rwxr-xr-x
      
    • chown:用于修改文件或目录的所有者。

      bash

      chown user:group filename  # 设置文件的所有者为user,所属组为group
      
    • su:用于切换用户。

      bash

      su username  # 切换到username用户
      
    • sudo:用于以超级用户权限执行命令。

      bash

      sudo command  # 以超级用户权限执行command命令
      

    3.3系统管理

    • systemctl:用于管理系统服务。

      bash

      systemctl start service_name  # 启动服务
      systemctl stop service_name  # 停止服务
      systemctl restart service_name  # 重启服务
      systemctl status service_name  # 查看服务状态
      
    • reboot:用于重启系统。

      bash

      reboot
      
    • shutdown:用于关闭系统。

      bash

      shutdown -h now  # 立即关闭系统
      shutdown -r now  # 立即重启系统
      
    • top:用于实时显示系统中各个进程的资源占用情况。

      bash

      top
      
    • ps:用于显示当前系统中的进程信息。

      bash

      ps aux  # 显示所有进程的详细信息
      
    • kill:用于终止指定进程。

      bash

      kill PID  # 终止PID对应的进程
      
    • killall:用于终止指定名称的所有进程。

      bash

      killall process_name  # 终止所有名为process_name的进程
      

    这些命令是Linux系统中Shell系统信息、用户权限和系统管理的基础,掌握它们可以帮助你更高效地管理系统。

    4.网络命令

            指令如下所示:

    4.1IP地址管理

    4.1.1 ifconfig(查看IP地址)

    • 功能:显示或配置网络接口。
    • 示例

      bash

      ifconfig eth0 up  # 启用eth0网卡
      ifconfig eth0 down  # 禁用eth0网卡
      ifconfig eth0 192.168.1.100 netmask 255.255.255.0  # 设置eth0的IP地址和子网掩码
      

    4.1.2 ip addr show(查看IP地址)

    • 功能:显示网络接口的IP地址信息。
    • 示例

      bash

      ip addr show eth0  # 显示eth0接口的IP地址
      

    4.1.3 ip route show(路由器管理)

    • 功能:显示路由表信息。
    • 示例

      bash

      ip route show  # 列出所有路由规则
      

    4.2网络连通性测试

    4. 2.1 ping (ping测试)

    • 功能:发送ICMP回声请求到指定主机,测试网络连通性。
    • 示例

      bash

      ping google.com  # 测试与Google服务器的连接
      

    4.2.2 traceroute (traceroute测试)

    • 功能:显示数据包到达目标主机所经过的路由。
    • 示例

      bash

      traceroute google.com  # 显示到达Google服务器的路径
      

    4.3网络服务状态

    4.3.1 netstat (netstat 查看)

    • 功能:显示网络连接、路由表、接口统计等信息。
    • 示例

      bash

      netstat -tulnp  # 显示所有监听的TCP、UDP端口及对应的程序
      

    4.3.2 ss (ss查看)

    • 功能:类似于netstat,但更高效,显示套接字统计信息。
    • 示例

      bash

      ss -tulnp  # 显示所有监听的TCP、UDP端口及对应的程序
      

    4.4域名解析

    4.4.1 nslookup (nslookup 查询)

    • 功能:查询DNS以获取域名的IP地址或其他DNS记录。
    • 示例

      bash

      nslookup google.com  # 获取Google的IP地址
      

    4.4.2 dig (dig查询)

    • 功能:类似于nslookup,但功能更强大,用于查询DNS记录。
    • 示例

      bash

      dig google.com  # 获取Google的DNS记录
      

    4.5网页访问

    4.5.1 curl (curl访问)

    • 功能:从URL下载数据或将数据上传到URL。
    • 示例

      bash

      curl https://www.google.com  # 下载Google主页的内容
      

    4.5.2 wget (wget下载)

    • 功能:从网络下载文件。
    • 示例

      bash

      wget https://www.google.com  # 下载Google主页的内容并保存为文件
      

    4.6远程登录与文件传输

    4.6.1 ssh (ssh登录)

    • 功能:使用SSH协议远程登录到另一台计算机。
    • 示例

      bash

      ssh user@hostname  # 登录到指定主机
      

    4.6.2 scp (登录)

    • 功能:使用SSH协议在本地和远程主机之间复制文件。
    • 示例

      bash

      scp file.txt user@hostname:/path/to/destination  # 将file.txt复制到远程主机的指定目录
      

    14. rsync (rsync同步)

    • 功能:高效地同步文件和目录,支持增量传输。
    • 示例

      bash

      rsync -avz /path/to/source user@hostname:/path/to/destination  # 同步本地目录到远程主机
      

    4.7防火墙管理

    4.7.1 iptables (iptables 查看)

    • 功能:显示当前的iptables防火墙规则。
    • 示例

      bash

      iptables -L  # 列出所有防火墙规则
      

    4.7.2 ufw (ufw 状态)

    • 功能:显示Uncomplicated Firewall (UFW)的状态。
    • 示例

      bash

      ufw status  # 查看UFW防火墙的状态和规则
      

    5. Shell脚本编写

    5.1 Shell脚本的基本结构

            Shell脚本通常以#!/bin/bash开头,这是指定使用Bash作为解释器。脚本的主体部分包含一系列的命令和控制结构。

    example.sh

    #!/bin/bash
    
    # 这是一个简单的Shell脚本示例
    
    # 输出Hello, World!
    echo "Hello, World!"
    

    5.2 变量

    变量用于存储数据。在Shell脚本中,变量名通常由字母、数字和下划线组成,但不能以数字开头。变量名是区分大小写的。

    example.sh

    #!/bin/bash
    
    # 定义变量
    name="John"
    age=30
    
    # 使用变量
    echo "My name is $name and I am $age years old."
    

    5.3 输入和输出

    echo命令用于输出文本到终端。read命令用于从用户输入读取数据。

    example.sh

    #!/bin/bash
    
    # 读取用户输入
    echo "Please enter your name:"
    read name
    
    # 输出用户输入
    echo "Hello, $name!"
    

    5.4 条件语句

    if语句用于根据条件执行不同的代码块。case语句用于多条件判断。

    example.sh

    #!/bin/bash
    
    # 判断一个数是否为正数
    # 提示用户输入一个数字
    echo "Please enter a number:"
    # 读取用户输入的数字,并将其赋值给变量 num
    read num
    
    # 使用 if-elif-else 语句判断 num 的正负性
    if [ $num -gt 0 ]; then
        # 如果 num 大于 0,输出 num 是正数
        echo "$num is a positive number."
    elif [ $num -lt 0 ]; then
        # 如果 num 小于 0,输出 num 是负数
        echo "$num is a negative number."
    else
        # 如果 num 既不大于 0 也不小于 0,即 num 等于 0,输出 num 是零
        echo "$num is zero."
    fi
    
    # 判断一个字符是元音还是辅音
    # 提示用户输入一个字符
    echo "Please enter a character:"
    # 读取用户输入的字符,并将其赋值给变量 char
    read char
    
    # 使用 case 语句判断字符的类型
    case $char in
        # 如果字符是 a、e、i、o、u 中的任意一个(不区分大小写),则认为是元音
        [aeiouAEIOU])
            echo "$char is a vowel."
            # 使用双分号 ;; 表示该 case 分支结束
            ;;
        # 如果字符是任意字母(大小写均可),则认为是辅音
        [a-zA-Z])
            echo "$char is a consonant."
            ;;
        # 如果字符不是上述两种情况,输出该字符不是字母
        *)
            echo "$char is not a letter."
            ;;
    esac
    

    5.5 循环

    for循环用于遍历一个列表或范围。while循环用于在条件为真时重复执行代码块。until循环与while循环相反,当条件为假时重复执行代码块。

    example.sh

    #!/bin/bash
    
    # for循环示例
    echo "Numbers from 1 to 5:"
    for i in {1..5}; do
        echo $i
    done
    
    # while循环示例
    echo "Countdown from 5 to 1:"
    count=5
    while [ $count -gt 0 ]; do
        echo $count
        count=$((count - 1))
    done
    
    # until循环示例
    echo "Count up from 1 to 5:"
    num=1
    until [ $num -gt 5 ]; do
        echo $num
        num=$((num + 1))
    done
    

    5.6 函数

    函数用于封装可重用的代码块。函数可以接受参数,并返回一个值。

    example.sh

    example.sh

    #!/bin/bash
    
    # 定义函数
    greet() {
        echo "Hello, $1!"
    }
    
    # 调用函数
    greet "Alice"
    greet "Bob"
    

    5.7 命令替换

    命令替换允许将命令的输出作为变量的值。可以使用反引号(`)或$()来实现命令替换。

    example.sh

    #!/bin/bash
    
    # 获取当前日期和时间
    current_date_time=$(date +"%Y-%m-%d %H:%M:%S")
    
    # 输出当前日期和时间
    echo "Current date and time: $current_date_time"

    6.输入输出重定向和管道

    6.1 输入输出重定向

    6.1.1 标准输入重定向 (<)

            在 shell 中,标准输入(stdin)默认是从键盘获取输入,其文件描述符为 0。使用 < 符号可以将文件内容作为命令的输入。

    # 将 file.txt 文件的内容作为 cat 命令的输入
    cat < file.txt
    

            这里 cat 命令通常用于显示文件内容,通过 < 重定向,它会读取 file.txt 的内容并输出。

    6.1.2 标准输出重定向 (> 和 >>)

            标准输出(stdout)默认是将命令的结果显示在终端上,文件描述符为 1。

    • >:用于覆盖输出,即如果目标文件已经存在,会先清空文件内容再写入新内容。
    # 将 "Hello" 写入 output.txt 文件,如果文件存在则覆盖其原有内容
    echo "Hello" > output.txt
    
    • >>:用于追加输出,会将新内容添加到目标文件的末尾。
    # 将 "World" 追加到 output.txt 文件末尾
    echo "World" >> output.txt
    

    6.1.3 标准错误重定向 (2> 和 2>>)

    标准错误(stderr)用于输出命令执行过程中的错误信息,文件描述符为 2。

    • 2>:用于覆盖错误输出,会清空目标文件并写入新的错误信息。
    # 将 ls 命令查找不存在目录时产生的错误信息写入 error.txt 文件
    ls /nonexistent 2> error.txt
    
    • 2>>:用于追加错误输出,会将新的错误信息添加到目标文件末尾。
    # 再次执行 ls 命令查找不存在目录,将错误信息追加到 error.txt 文件末尾
    ls /nonexistent2 2>> error.txt
    

    6.1.4 set -v 调试选项

      set -v 选项会在脚本执行时显示所有读入的行,方便查看脚本的执行流程。以下是一个示例脚本:

    #!/bin/bash
    set -v
    echo "This is a test."
    echo "The script is running."
    

            执行该脚本时,终端会显示每行代码及其执行结果,有助于调试复杂脚本。

    6.1.5 set -e 调试选项

      set -e 选项会使脚本在遇到任何返回非零状态(表示错误)的命令时立即退出。示例脚本如下:

    test_script2.sh

    #!/bin/bash
    set -e
    ls /nonexistent  # 这个命令会失败
    echo "This line will not be executed if the above command fails."
    

            在这个脚本中,由于 ls /nonexistent 命令会失败,脚本会立即退出,不会执行后面的 echo 语句。

    6.2 管道 (|)

    管道是一种在 shell 中用于连接多个命令的机制,使用 | 符号。管道的作用是将前一个命令的标准输出作为后一个命令的标准输入。

    # 将 ls 命令的输出作为 grep 命令的输入,查找包含 "txt" 的文件名
    ls | grep txt
    

            在这个例子中,ls 命令列出当前目录下的所有文件和目录,其输出通过管道传递给 grep 命令,grep 命令会在这些输出中查找包含 "txt" 的行并输出。

            管道可以连接多个命令,形成一个命令链,每个命令处理前一个命令的输出,从而实现复杂的数据处理。例如:

    # 列出当前目录下的所有文件和目录,通过管道传递给 wc 命令统计行数
    ls | wc -l
    

            这里 ls 列出文件和目录,wc -l 统计输入的行数,最终输出当前目录下文件和目录的数量。

    7.正则表达式和文本处理

            正则表达式是一种用于匹配和处理文本的强大工具,在 Linux 系统中,grep 命令常与正则表达式结合使用来搜索文本。下面详细解释你提到的几个正则表达式示例:

    基础概念

            在正则表达式中,一些特殊字符有特定的含义:

    • ^:匹配行的开头。
    • [ ]:匹配方括号内指定的任意一个字符。
    • \d:匹配任意数字,等价于 [0-9]
    • *:匹配前面的元素零次或多次。

    示例分析

    (1)grep "^[a-zA-Z]"

    grep "^[a-zA-Z]" file.txt
    
    • 解释:此正则表达式用于搜索以字母开头的行。^ 表示匹配行的开头,[a-zA-Z] 表示匹配任意一个大小写字母。所以该命令会在 file.txt 文件中查找所有以字母开头的行,并将这些行输出。

    (2)grep "^\d" file.txt

    grep "^\d" file.txt
    
    • 解释:这个命令用于查找 file.txt 中以数字开头的行。^ 同样表示行的开头,\d 是一个元字符,代表任意数字。因此,该命令会筛选出所有以数字开头的行。

    (3)grep "oo*" file.tx

    grep "oo*" file.txt
    
    • 解释:此正则表达式用于查找包含一个或多个 o 的行。o 是要匹配的字符,* 表示前面的字符 o 可以出现零次或多次。所以它会匹配包含 oooooo 等情况的行。

    匹配以 "abc" 开头的行

    grep "^abc" file.txt
    

            这里 ^ 确保匹配从行的开头开始,所以只会输出以 "abc" 开头的行。

    匹配包含数字的行

    grep "\d" file.txt
    

      \d 匹配任意数字,该命令会查找 file.txt 中包含数字的所有行。

    匹配以 "xyz" 结尾的行

    grep "xyz$" file.txt
    

      $ 是另一个元字符,用于匹配行的结尾,所以此命令会输出以 "xyz" 结尾的行。

            通过使用不同的正则表达式元字符和组合,可以灵活地对文本进行搜索和筛选,满足各种复杂的文本处理需求。

    8.压缩和归档

    8.1压缩命令

    (1) gzip

      gzip 是一个广泛使用的压缩工具,它采用 Lempel - Ziv 编码(LZ77)算法,压缩后的文件扩展名为 .gz

    基本用法

    gzip file.txt
    

    上述命令会将 file.txt 压缩为 file.txt.gz,并且原文件 file.txt 会被删除。

    常用参数

    • -k:保留原始文件,不删除。
    gzip -k file.txt
    
    • -d:解压缩文件,等同于 gunzip 命令。
    gzip -d file.txt.gz
    
    • -## 是 1 - 9 的数字,用于指定压缩级别,1 为最快(压缩比最低),9 为最慢(压缩比最高),默认是 6。
    gzip -9 file.txt
    

    (2) bzip2

    bzip2 使用 Burrows - Wheeler 块排序文本压缩算法和霍夫曼编码,通常能提供比 gzip 更高的压缩比,但压缩和解压缩速度相对较慢,压缩后的文件扩展名为 .bz2

    基本用法

    bzip2 file.txt
    

    此命令会把 file.txt 压缩成 file.txt.bz2,原文件会被删除。

    常用参数

    • -k:保留原始文件。
    bzip2 -k file.txt
    
    • -d:解压缩文件,等同于 bunzip2 命令。
    bzip2 -d file.txt.bz2
    
    • -#:指定压缩级别,范围是 1 - 9,含义与 gzip 类似。
    bzip2 -9 file.txt
    

    (3) xz

      xz 采用 LZMA2 压缩算法,能实现非常高的压缩比,不过压缩和解压缩的时间可能较长,压缩后的文件扩展名为 .xz

    基本用法

    xz file.txt
    

    该命令会将 file.txt 压缩为 file.txt.xz,原文件被删除。

    常用参数

    • -k:保留原始文件。
    xz -k file.txt
    
    • -d:解压缩文件,等同于 unxz 命令。
    xz -d file.txt.xz
    
    • -#:指定压缩级别,1 - 9 数字,9 为最高压缩比。
    xz -9 file.txt
    

    8.2归档命令

    (1) tar

      tar 是一个用于创建和提取归档文件的工具,它本身不具备压缩功能,但可以与 gzipbzip2xz 等压缩工具结合使用。

    创建归档文件

    tar -cvf archive.tar directory/
    
    • -c:创建新的归档文件。
    • -v:显示详细的操作过程。
    • -f:指定归档文件的名称。

    结合压缩工具

    • 使用 gzip 压缩:
    tar -czvf archive.tar.gz directory/
    

    -z 表示使用 gzip 进行压缩。

    • 使用 bzip2 压缩:
    tar -cjvf archive.tar.bz2 directory/
    

    -j 表示使用 bzip2 进行压缩。

    • 使用 xz 压缩:
    tar -cJvf archive.tar.xz directory/
    

       -J 表示使用 xz 进行压缩。

    解压缩归档文件

    tar -xvf archive.tar
    
    • -x:从归档文件中提取文件。

            对于压缩的归档文件,根据压缩类型使用相应的参数:

    tar -xzvf archive.tar.gz
    tar -xjvf archive.tar.bz2
    tar -xJvf archive.tar.xz
    

    (2) zip

      zip 是一个跨平台的压缩工具,可创建 .zip 格式的压缩文件,支持递归压缩目录。

    创建压缩文件

    zip -r archive.zip directory/
    
    • -r:递归压缩目录,将目录及其子目录下的所有文件都压缩。

    解压缩文件

    unzip archive.zip
    

    (3) rar

      rar 用于创建 .rar 格式的压缩文件,在 Linux 系统中需要先安装 rar 工具。

    创建压缩文件

    rar a archive.rar directory/
    
    • a:添加文件到压缩包。

    解压缩文件

    bash

    unrar x archive.rar
    
    • x:解压缩文件并保留原文件的目录结构。

    9.脚本调试

    9.1 set 命令

    set -x

            此选项会在执行每一条命令之前,将命令及其参数打印出来,方便查看命令执行的具体情况。

    #!/bin/bash
    set -x
    var=10
    echo $var
    

            执行该脚本时,终端会输出每条命令的执行情况,类似如下:

    + var=10
    + echo 10
    10
    

    set -v

      set -v 会在读取脚本的每一行时将其打印出来,而不是在执行时。它有助于查看脚本的读取流程。

    #!/bin/bash
    set -v
    var=10
    echo $var
    

    执行时输出:

    var=10
    + var=10
    echo $var
    + echo 10
    10
    

    set -e

            若脚本中的某个命令返回非零退出状态码(表示命令执行失败),set -e 会使脚本立即终止执行,避免错误继续蔓延。

    #!/bin/bash
    set -e
    ls /nonexistent
    echo "This line won't be executed if the above command fails."
    

            由于 ls /nonexistent 会失败,脚本会立即退出,不会执行后续的 echo 命令。

    9.2 bash -x

            在执行脚本时,使用 bash -x 可以在不修改脚本内容的情况下启用调试模式,它和在脚本中使用 set -x 效果类似。

    bash -x test_script.sh
    

    9.3 bashdb

      bashdb 是一个功能强大的 Bash 调试器,类似于 gdb 对 C 语言的调试功能。

    9.4 安装

            在大多数 Linux 发行版中,可以使用包管理器进行安装,例如在 Ubuntu 上:

    sudo apt-get install bashdb
    

    使用示例

            假设有一个脚本 test_script.sh

    #!/bin/bash
    sum=0
    for i in {1..5}; do
        sum=$((sum + i))
    done
    echo $sum
    

    使用 bashdb 调试该脚本:

    bashdb test_script.sh
    

    进入调试环境后,可以使用以下常用命令:

    • nnext):执行下一行代码。
    • sstep):单步执行,遇到函数调用时会进入函数内部。
    • ccontinue):继续执行脚本,直到下一个断点。
    • bbreak):设置断点,例如 b 5 表示在第 5 行设置断点。

    9.5 echo 调试

            虽然简单,但 echo 语句在调试中也非常实用。可以在脚本中关键位置添加 echo 语句,输出变量的值或提示信息,以此来查看脚本的执行流程和变量状态。

    #!/bin/bash
    var=10
    echo "The value of var is: $var"
    sum=$((var + 5))
    echo "The sum is: $sum"
    

            执行脚本时,会输出变量的值,方便调试。


    http://www.niftyadmin.cn/n/5864099.html

    相关文章

    【环境配置】maven,mysql,node.js,vue的快速配置与上手

    【环境配置】maven,mysql,node.js,vue的快速配置与上手 我们在利用springbootvue来进行全栈项目开发时&#xff0c;需要做很多的准备工作&#xff0c;其中maven,mysql,node,js和vue的配置是必不可少的。 本期我们尽可能精简地介绍它们的配置以及快速上手。 1.maven 1.1.下载…

    推荐一款AI大模型托管平台-OpenWebUI

    推荐一款AI大模型托管平台-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官网地址&#xff1a;https://openwebui.com/ GitHub地址&#xff1a; https://github.com/open-webui/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离…

    PnP——根据3D与2d图片估计相机运动

    引入 当知道n个3D空间点及其投影位置和2d像素点时&#xff0c;如何估计相机的位姿。PnP(Perspective-n-Point) 是求解3D到2D点对运动的方法。 直接线性变换&#xff08;DLT&#xff09; 问题描述 已知一组3D点 P i ( X i , Y i , Z i , 1 ) ⊤ \mathbf{P}_i (X_i, Y_i, …

    【Git 学习笔记_27】DIY 实战篇:利用 DeepSeek 实现 GitHub 的 GPG 秘钥创建与配置

    文章目录 1 前言2 准备工作3 具体配置过程3.1. 本地生成 GPG 密钥3.2. 导出 GPG 密钥3.3. 将密钥配置到 Git 中3.4. 测试提交 4 问题排查记录5 小结与复盘 1 前言 昨天在更新我的第二个 Vim 专栏《Mastering Vim (2nd Ed.)》时遇到一个经典的 Git 操作问题&#xff1a;如何在 …

    【Python量化金融实战】-第1章:Python量化金融概述:1.1量化金融的定义与发展历程

    本小节学习建议&#xff1a;掌握Python编程、统计学&#xff08;时间序列分析&#xff09;、金融学基础&#xff08;资产定价理论&#xff09;三者结合&#xff0c;是进入量化领域的核心路径。 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章目录 1.1 量化金…

    06C语言——指针

    一、指针入门 (1)、准备知识 0、图解&#xff1a; 1、内存地址 字节&#xff1a;字节是内存的容量单位&#xff0c;英文称为 byte&#xff0c;一个字节有8位&#xff0c;即 1byte(0000 0000 --- 1111 1111) 8bits(0 --- 1) 地址&#xff1a;系统为了便于区分每一个字节而对…

    基于模仿学习(IL)的端到端自动驾驶发展路径

    基于模仿学习&#xff08;IL&#xff09;的端到端自动驾驶发展路径 1. 核心论文解析 (1) UniAD&#xff1a;感知-规划一体化 核心思想&#xff1a;首次提出将感知任务&#xff08;如目标检测、车道线识别、轨迹预测&#xff09;与规划任务集成到统一的端到端框架中&#xff…

    css+js提问

    文章目录 1. css部分隐藏元素的几种方式 2. js部分 1. css部分 隐藏元素的几种方式 overflow: hidden;display: noneopacity: 0position&#xff1a;top和left设置成足够大的负数visibility: hidden设置height&#xff0c;width等盒模型属性为0 盒子模型 标准盒子模型&#xf…