Linux脚本如何显示行号?有哪些实现方法?

在Linux系统中,显示脚本或文件的行号是日常开发和运维中的常见需求,无论是调试代码、查看文件结构还是定位错误,行号都能提供直观的定位信息,本文将详细介绍Linux中显示行号的多种方法,涵盖命令行工具、文本编辑器以及脚本动态行号显示等场景,并通过表格对比不同工具的适用场景和特点,最后附上相关FAQs解答常见问题。

linux中脚本如何显示行号

使用命令行工具显示行号

Linux提供了多个命令行工具,可以快速为文件内容添加行号并显示,其中最常用的包括catnllessmore等,这些工具各有特点,适用于不同的查看需求。

cat命令:简单快速显示行号

cat是Linux中最基础的文件内容查看工具,通过-n选项可以为每一行内容添加行号并显示,其基本语法为:

cat -n 文件名

查看test.sh并显示行号:

cat -n test.sh

输出示例

     1 #!/bin/bash
     2 echo "Hello, Linux!"
     3 for i in {1..5}; do
     4     echo "Count: $i"
     5 done

特点

  • 适合查看短文件,内容直接输出到终端,无需分页;
  • 默认显示所有行(包括空行),行号从1开始递增;
  • 若需跳过空行,可结合-b选项(cat -b 文件名),此时空行不会被编号。

nl命令:灵活定制行号格式

nl(number lines)是专门用于添加行号的工具,相比cat -n,它提供了更丰富的选项,允许自定义行号的起始值、格式、显示范围等,其基本语法为:

nl [选项] 文件名

常用选项

  • -b:指定行号类型,-b a表示对所有行编号(包括空行),-b t表示仅对非空行编号(默认);
  • -v:设置起始行号,如-v 10表示从第10行开始编号;
  • -i:设置行号增量,默认为1,-i 2表示每行编号递增2;
  • -n:设置行号格式,-n ln(左对齐,默认)、-n rn(右对齐)、-n rz(右对齐补零)。

示例
test.sh使用nl命令,设置起始行号为5,仅对非空行编号,行号右对齐补零:

nl -b t -v 5 -n rz test.sh

输出示例

     05 #!/bin/bash
     06 echo "Hello, Linux!"
     07 for i in {1..5}; do
     08     echo "Count: $i"
     09 done

特点

  • 适合需要自定义行号格式的场景(如日志文件、代码规范检查);
  • 支持对特定行范围编号(通过-p选项跳过连续空行)。

lessmore命令:分页查看时显示行号

较多时,直接使用cat会导致终端输出被截断,此时需要分页查看工具lessmore,两者均支持行号显示,但less功能更强大(支持前后翻页、搜索等)。

linux中脚本如何显示行号

  • less命令:通过-N选项启用行号显示,语法为less -N 文件名
    示例:less -N test.sh,进入less界面后,可通过上下箭头键或j/k键翻页,键搜索内容,行号会始终显示在左侧。
  • more命令:通过-n选项启用行号显示,语法为more -n 文件名
    示例:more -n test.sh,支持向下翻页(空格键或回车键),但无法向上翻页,功能较less简单。

特点

  • less:适合查看大文件,支持交互操作(如搜索、跳转),行号显示可动态切换(按nu显示行号,nonu隐藏行号);
  • more:轻量级分页工具,适用于简单查看,功能有限。

其他工具:grepawksed结合显示行号

在处理文本时,有时需要结合其他工具实现更灵活的行号显示,

  • grep -n:显示匹配行的行号,语法为grep -n "模式" 文件名
    示例:grep -n "echo" test.sh,输出包含echo的行及其行号:

    2 echo "Hello, Linux!"
    4     echo "Count: $i"
  • awk:通过内置变量NR(记录号,即行号)自定义行号显示,语法为awk '{print NR, $0}' 文件名
    示例:awk '{print NR "t" $0}' test.sh,输出格式为“行号+制表符+内容”:

    1 #!/bin/bash
    2 echo "Hello, Linux!"
    3 for i in {1..5}; do
    4     echo "Count: $i"
    5 done
  • sed:结合命令显示行号,语法为sed '=' 文件名 | sed 'N;s/n/t/'(将行号与内容合并显示)。
    示例:sed '=' test.sh | sed 'N;s/n/t/',输出与awk类似:

    1 #!/bin/bash
    2 echo "Hello, Linux!"
    3 for i in {1..5}; do
    4     echo "Count: $i"
    5 done

文本编辑器中显示行号

在编写或编辑脚本时,文本编辑器(如vimnano)的行号显示功能能帮助开发者快速定位代码位置。

vim/nvim:编辑模式下动态显示行号

vim是Linux中最常用的文本编辑器,支持多种行号显示模式:

  • 启用/关闭行号:在普通模式下输入set number(或set nu)启用行号,set nonumber(或set nonu)关闭行号;
  • 相对行号:输入set relativenumber(或set rnu),显示当前行与光标行的相对距离(适用于代码跳转);
  • 永久设置:若希望每次打开vim都默认显示行号,可在配置文件~/.vimrc中添加set number

示例:在vim中打开test.sh,输入set nu后,编辑器左侧会显示行号:

1 #!/bin/bash
2 echo "Hello, Linux!"
3 for i in {1..5}; do
4     echo "Count: $i"
5 done

nano:简单编辑器中的行号显示

nano是一款轻量级文本编辑器,通过-l选项可在编辑时显示行号,语法为nano -l 文件名
示例:nano -l test.sh,编辑器底部会显示当前行号和列号(如Line 5, Column 10)。

脚本执行时动态显示行号

在调试脚本时,除了静态查看行号,还需要在脚本执行时动态显示当前执行的行号,以便定位逻辑错误,Linux提供了多种方式实现这一需求。

bash -x:调试模式显示行号和命令

bash -x以调试模式运行脚本,会显示每条命令及其行号、执行结果,格式为+ 行号 命令
语法:bash -x 脚本名
示例:bash -x test.sh,输出如下:

linux中脚本如何显示行号

+ echo 'Hello, Linux!'
Hello, Linux!
+ for i in {1..5}
+ echo 'Count: 1'
Count: 1
+ for i in {1..5}
+ echo 'Count: 2'
Count: 2
...(后续省略)

特点

  • 适合调试脚本逻辑错误,能清晰看到每条命令的执行顺序和结果;
  • 若仅需对脚本部分代码启用调试,可在脚本中使用set -x(开启调试)和set +x(关闭调试)。

$LINENO变量:获取当前行号

在脚本中,内置变量$LINENO表示当前执行到的行号,结合echo可输出错误信息或日志时附带行号。
示例:在test.sh中添加错误处理逻辑:

#!/bin/bash
echo "Starting script at line $LINENO"
if [ -z "$1" ]; then
    echo "Error: Missing argument at line $LINENO" >&2
    exit 1
fi
echo "Argument received: $1 at line $LINENO"

执行bash test.sh(无参数),输出:

Starting script at line 2
Error: Missing argument at line 5

特点

  • 适用于脚本内部调试,可在日志或错误提示中快速定位问题行;
  • 注意$LINENO获取的是脚本源码行号,若在函数或子shell中使用,可能返回函数内或子shell的行号。

不同工具显示行号的对比

为更直观地选择合适的工具,以下通过表格对比catnllessvim等工具的显示行号特点:

工具名 常用选项 适用场景 特点
cat -n(显示行号) 查看短文件,快速输出内容 简单直接,不支持分页,空行会被编号
nl -b/-v/-n 需要自定义行号格式(如起始值、对齐) 功能灵活,适合日志、代码规范检查
less -N(显示行号) 查看大文件,支持交互操作 分页显示,可搜索、跳转,行号可动态切换
more -n(显示行号) 轻量级分页查看 功能简单,仅支持向下翻页
vim/nvim set number 编辑脚本时实时显示行号 支持相对行号,适合代码编写和定位
grep -n(显示匹配行号) 查找特定内容并定位行号 仅显示匹配行,适合快速定位关键词

相关问答FAQs

问题1:为什么使用cat -n显示行号后,复制内容时行号也被复制了?如何避免?

解答cat -n的行号是通过在每行内容前添加数字和制表符(t)实现的,因此直接复制终端输出时,行号会被一同复制,若需复制纯内容(不含行号),可通过以下方式解决:

  1. 使用awk列:awk '{print $2}' 文件名(假设行号和内容以空格或制表符分隔,$2表示第二列);
  2. 使用sed删除行号:sed 's/^[[:space:]]*[0-9]+[[:space:]]*//' 文件名(匹配行号并删除);
  3. 在终端中手动选中内容时,仅选中文本部分(避开行号列),或使用xclip等工具直接复制指定列。

问题2:在脚本执行时,如何动态显示当前执行的行号,同时不显示bash -x的调试信息?

解答:若不想使用bash -x(会显示所有命令和前缀),但希望在脚本执行时输出当前行号,可通过自定义函数结合$LINENO实现。

#!/bin/bash
log() {
    echo "[Line $LINENO] $1"
}
log "Script started"
for i in {1..3}; do
    log "Processing $i"
done
log "Script ended"

执行后输出:

[Line 3] Script started
[Line 5] Processing 1
[Line 5] Processing 2
[Line 5] Processing 3
[Line 6] Script ended

这种方式仅输出自定义日志信息,包含行号且不会显示调试命令,适合轻量级调试需求。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/25942.html

(0)
酷番叔酷番叔
上一篇 2025年9月19日 08:25
下一篇 2025年9月19日 08:39

相关推荐

  • Linux如何取消屏蔽或解除禁用设置?

    在Linux系统中,“屏蔽”通常指通过权限设置、安全策略或防火墙规则限制用户、进程或网络访问的行为,取消屏蔽则需要根据具体场景,使用相应的命令或工具进行操作,以下从文件权限、用户/组权限、网络访问、进程优先级及系统级安全策略等场景,详细说明取消屏蔽的方法,文件/目录权限屏蔽的取消文件或目录的“屏蔽”通常源于权限……

    2025年9月16日
    7600
  • linux系统如何配置网络打印机

    Linux系统中配置网络打印机,通常可安装相应驱动,通过系统设置或命令行添加打印机

    2025年8月16日
    10000
  • Linux文件系统为何是高效操作的关键?

    Linux的”万物皆文件”Linux将硬件设备、目录、普通数据等统一抽象为文件,主要分为七类:普通文件(-):文本、图片、可执行程序等常规数据,通过file 文件名可查看类型,目录文件(d):用于组织文件的特殊文件,本质是文件路径的映射表,符号链接(l):类似Windows快捷方式,存储目标文件路径(ln -s……

    2025年7月21日
    10100
  • Linux系统如何查看是否处于热备状态?

    在Linux系统中,热备(Hot Standby)是指通过高可用集群技术,确保主节点故障时备用节点能自动接管服务,保障业务连续性,要查看Linux系统是否配置了热备及热备状态,需结合集群管理工具、服务状态、系统资源等多维度进行排查,以下从常见集群场景出发,详细说明查看方法,基于Pacemaker/Corosyn……

    2025年10月8日
    7200
  • Linux中,如何查看文件的详细属性信息?

    在Linux系统中,文件属性是理解文件管理、权限控制和系统安全的基础,文件属性不仅包括我们熟知的权限(读、写、执行)、所有者和所属组,还包含时间戳、inode号、文件大小、硬链接数等元数据信息,掌握如何查看这些属性,对于日常运维、故障排查和安全管理至关重要,本文将详细介绍Linux中查看文件属性的多种方法,包括……

    2025年9月8日
    8800

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信