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如何查服务器型号?5种方法各发行版通用

    使用 dmidecode 命令(推荐)原理:读取DMI(桌面管理接口)硬件信息,最权威,步骤:sudo dmidecode -t system | grep -E "Manufacturer|Product Name|Serial Number"输出示例:Manufacturer: Dell……

    2025年7月28日
    9200
  • Linux操作系统中,如何正确建立软链接的步骤是什么?

    在Linux系统中,软链接(也称为符号链接)是一种特殊的文件类型,它类似于Windows系统中的快捷方式,指向另一个文件或目录的路径,与硬链接直接指向文件的inode不同,软链接存储的是目标文件或目录的路径字符串,因此可以跨文件系统创建,且对目标文件的操作(如移动、删除)会直接影响软链接的有效性,下面将详细介绍……

    2025年9月24日
    10500
  • Linux系统下如何为普通用户设置和管理文件读写执行的具体权限?

    Linux系统中,权限管理是保障系统安全与稳定运行的核心机制,合理分配普通用户权限既能满足日常操作需求,又能避免越权操作带来的风险,本文将从基础权限概念、sudo权限配置、特殊权限设置、ACL(访问控制列表)扩展四个维度,详细说明如何为普通用户分配权限,Linux基础权限管理:用户、组与文件权限Linux权限基……

    2025年10月2日
    7200
  • Linux系统中如何删除虚拟接口?命令行操作与配置文件修改方法

    在Linux系统中,虚拟接口是物理网络接口的软件抽象,常用于实现网络隔离、负载均衡、隧道通信等场景,常见的虚拟接口包括VLAN接口、网桥(Bridge)、VXLAN、GRE隧道、Bonding聚合接口等,当虚拟接口配置错误、不再需要或需要重新规划时,正确删除这些接口是保障网络稳定运行的关键操作,本文将详细介绍L……

    2025年10月3日
    7900
  • Linux系统如何安装hph?

    在Linux系统中安装PHP是Web开发中的常见需求,无论是搭建WordPress、Laravel等应用,还是运行自定义的PHP脚本,都需要正确安装并配置PHP环境,本文将以主流Linux发行版(如Ubuntu/Debian、CentOS/RHEL、Arch Linux)为例,详细介绍PHP的安装步骤,包括环境……

    2025年10月7日
    9600

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信