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)
酷番叔酷番叔
上一篇 3小时前
下一篇 2小时前

相关推荐

  • Linux数学库安装太复杂?

    数学库的作用与常见类型数学库提供优化的数学函数(如三角函数、矩阵运算、傅里叶变换等),分为两类:基础数学库:如 libm(标准C数学库),包含sin(), log()等基础函数,高级数学库:BLAS/LAPACK:线性代数计算(矩阵运算、方程组求解),FFTW:快速傅里叶变换,GMP:高精度计算,添加数学库的三……

    2025年8月8日
    2000
  • Linux下如何给文件添加行号?命令使用方法详解

    在Linux系统管理和文本处理中,为文件内容添加行号是一项常见需求,例如代码调试、日志分析、文档标注等场景,Linux提供了多种命令和工具可实现行号添加功能,不同方法在灵活性、格式控制和适用场景上各有特点,本文将详细介绍几种主流的行号添加方法,包括命令行工具(cat、nl、sed、awk)和交互式编辑器(vim……

    1天前
    500
  • linux如何重新获取ip

    Linux中,可使用sudo dhclient命令重新获取IP地址,适用于动态IP

    2025年8月17日
    1900
  • Linux系统如何打开cmd命令行窗口?

    在Linux系统中,并没有Windows系统中的“cmd.exe”程序,因为Linux的命令行工具与Windows的命令提示符(cmd)设计逻辑和底层架构完全不同,Linux默认使用Shell作为命令行解释器,常见的有Bash(Bourne Again Shell)、Zsh(Z Shell)等,它们提供了更强大……

    3天前
    400
  • Linux中如何正确结束正在执行的命令?

    在Linux系统中,结束一段命令是日常操作中常见的需求,无论是中断卡死的前台进程、终止后台任务,还是强制结束无响应的程序,都需要掌握不同的方法,Linux提供了多种命令和快捷键组合,适用于不同场景,理解它们的原理和适用场景能更高效地管理系统进程,基础快捷键:前台进程的即时中断当用户在终端输入命令并按下回车后,该……

    2天前
    600

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信