帮助我使这个bash脚本漂亮,或者只是不那么可怕

Joe*_*oel 0 bash

我有一个名为print_code.sh的简单bash脚本,它采用文件名,并打印出带有行号的文件.

这里是:

FILE=$1
line=0;
numLines=`wc -l $FILE | sed 's/ .*$//'`
digits=`echo "l($numLines)/l(10)+1" | bc -l`
digits=`echo "0$digits" | sed 's/\..*$//'`
for i in `cat $FILE | sed 's/ /_=SPACE=_/g'`; do
  line=`echo $line + 1 | bc`;
  i=`echo $i | sed 's/_=SPACE=_/ /g'`;
  printf "%${digits}d | %s\n" $line "$i"
done
Run Code Online (Sandbox Code Playgroud)

这是一个虚构的语言愚蠢的源文件:

var x = 1
var y = 2
var z = 3
func dostuff {
  var a
  var b
  x = x + 1
  y = y + 1
  z = z + 1
  a = x + y + z
  b = a
}
Run Code Online (Sandbox Code Playgroud)

这是带有行号的输出:

01 | var x = 1
02 | var y = 2
03 | var z = 3
04 | func dostuff {
05 |   var a
06 |   var b
07 |   x = x + 1
08 |   y = y + 1
09 |   z = z + 1
10 |   a = x + y + z
11 |   b = a
12 | }
Run Code Online (Sandbox Code Playgroud)

有(至少)两个官能问题print_code.sh:

  • 任何空行都将被忽略 - 这将打破编号
  • 如果源文件包含选项卡,则选项卡字符将被视为换行符

而且,在某些地方它是hackish,因为我不太了解bash - 特别是用占位符= SPACE =替换空格字符,所以我们可以使用for迭代每一行.

这个代码可以被清理的最佳方式是什么,这样就不会发生hackish,并且上述功能问题会消失?

我错过了其他任何功能性问题吗?