我正在寻找一种方法来打印我的脚本正在经历的文件的行号。我发现了$LINENO
,但是当我发现的时候
echo 'Found foo in file' $(basename $foo) 'on line' $LINENO >> foo.csv
它打印结果“在文件的第 97 行找到 foo 在文件 Foo 中.csv
。我希望它打印它正在查看的文件中的行,而不是它所在的脚本行。我如何回显中的行号文件?
答案1
您可以nl
在浏览文件之前对文件的行进行编号:
$ cat testfile
a
b
c
$ nl -b a testfile
1 a
2 b
3 c
请注意,这-b a
是必需的,因为默认情况下nl
不对空行进行编号。
当然,如果您的文件非常大,这将是低效的,因为它会遍历该文件两次。
也许更好的选择是使用您自己的行计数器,这样您只需浏览该文件一次:
COUNT=0
while read -r line; do
COUNT=$(( $COUNT + 1 ))
if [ ... ];then
# Do things to the line
# Make use of COUNT to show line number
fi
done < your_file_here
仅当您逐行处理文件时,这才有效。如果您使用grep
例如,它将不起作用。
答案2
我发现执行此操作的方法是将trap DEBUG
当前行号存储到辅助变量和 trap ERR
转储它们:
#!/bin/bash
trap 'LASTLINENO=$_LINENO;_LINENO=$LINENO' DEBUG
trap 'echo ERROR in file" $(basename $0) on line $LASTLINENO" >>logfile' ERR
echo test
test echo
bla
这将在控制台上打印:
test
./test.bash: line 8: bla: command not found
并存储在日志档案:
ERROR in file test.bash on line 8
用于显示脚本:
cat -n test.bash
1 #!/bin/bash
2
3 trap 'LASTLINENO=$_LINENO;_LINENO=$LINENO' DEBUG
4 trap 'echo ERROR in file" $(basename $0) on line $LASTLINENO"' ERR
5
6 echo test
7 test echo
8 bla
并显示所需的(损坏的)行:
sed -ne 8p <test.bash
bla