Shell 脚本:以文件名作为参数,并在标准输出上显示文件内容,并以行号作为前缀

Shell 脚本:以文件名作为参数,并在标准输出上显示文件内容,并以行号作为前缀

因此,我是 shell 脚本的新手,我正在尝试编写一个 shell 脚本,该脚本以 filename( .txt) 作为参数并在标准输出上显示每行前缀的行号。

这是我经过一番研究后编写的脚本:-

#!/bin/bash

filename="$1"

nl -w2 -ba -s -d $'\n' filename

并出现以下错误:-

nl: ''$'\n': No such file or directory
nl: filename: No such file or directory

我的.txt文件内容是:-

This is first line.
This is second line.
This is third line.

期望的输出是:-

1This is first line.
2This is second line.
3This is third line.

如果传递的参数不是文件,我还希望进行某种错误处理。

答案1

问题nl -w2 -ba -s -d $'\n' filename

  • -s需要选项参数。在您的代码中-d被解释为的选项参数-s。我猜这不是您的本意。

    如果要-s取一个空字符串,则提供一个空字符串:-s ''。注意按照惯例(2a这里)-w2等同于-w 2-ba等同于-b a,但-s''工具会将其视为-s且 不等同于-s ''。您需要使用-s ''(或-s "") 将空字符串传递给-s

  • 根据上述内容,你的-d被解释为的选项参数-s;因此-d不被解释为选项。

  • 因此,换行符(来自 的扩展$'\n')不被解释为 的选项参数-d。它被解释为路径名,并且No such file or directory

  • filename是一个文字字符串:filename。有No such file or directory。你想要$filename你想双引号它(即"$filename",就像您双引号一样"$1")。

  • 考虑--(如果您的nl支持),以防$filename以 开头-

修复:

nl -w 2 -b a -s '' -d $'\n' "$filename"

错误处理是另一个主题。请参阅(在 Bash 中)help test,尤其test -e是 或test -f;还有help [。基本测试可能是:

[ -f "$filename" ] || exit 1

nl …

相关内容