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终端中如何具体停止正在执行的ping命令呢?

    在Linux系统中,ping命令是常用的网络诊断工具,通过发送ICMP回显请求测试与目标主机的连通性,在实际使用中,常需要根据场景停止ping操作,如手动测试结束、后台任务管理或脚本自动化控制,本文将详细介绍Linux中停止ping的多种方法,涵盖前台交互、后台任务、脚本控制及异常处理等场景,并结合表格对比不同……

    2025年8月26日
    83200
  • Windows 7如何轻松安装Linux?

    在Windows 7电脑上安装Linux需先备份数据,然后创建Linux启动U盘,启动时选择U盘引导,进入安装程序后分区硬盘(可双系统共存或替换Windows),完成安装并设置启动项即可。

    2025年7月9日
    7200
  • 在Linux中如何正确重启网卡?命令行操作步骤及注意事项详解?

    在Linux系统中,重启网卡是常见的网络故障排查或配置更新操作,通常用于解决网络连接异常、IP地址冲突、服务未响应等问题,不同Linux发行版可能采用不同的网络管理工具(如传统的ifconfig/ifupdown、现代的NetworkManager、systemd等),但重启网卡的逻辑基本一致,本文将详细介绍多……

    2025年9月29日
    3700
  • Linux下如何使用GDB调试程序?

    在Linux系统中,GDB(GNU Debugger)是功能强大的调试工具,主要用于调试C、C++、Go等语言编写的程序,通过GDB,开发者可以控制程序执行、设置断点、查看变量值、分析内存状态等,从而快速定位程序中的bug,以下将详细介绍GDB的使用方法,从安装到高级功能,帮助开发者掌握这一工具,安装GDB在使……

    2025年9月18日
    5100
  • 如何设置IP地址和子网掩码?

    在Linux系统中设置IP地址是网络管理的基础操作,可通过命令行工具或配置文件实现,以下是详细方法,涵盖临时配置与永久生效方案,适用于主流通用发行版(如Ubuntu、CentOS、Debian):临时设置IP(重启失效)方法1:使用 ip 命令(推荐)# 设置默认网关sudo ip route add defa……

    2025年7月12日
    9200

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信