因此,我是 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 …
。