“假设文件名作为命令行参数给出”,这是什么意思?

Aru*_*nga -3 shell-script arguments

我需要编写一个 shell 脚本来显示文件中的单词、字符和行的总数,但文件名是“作为命令行参数给出的”。这是什么意思,我该如何使用它?

Kus*_*nda 5

如果文件名作为命令行参数给出,这意味着您的脚本被调用为

./myscript.sh some-file-name
Run Code Online (Sandbox Code Playgroud)

即,文件名作为命令行上的参数给出。

因此,脚本位置参数列表的第一个元素将自动填充文件名。位置参数是值$1$2$3等(有$#这些),在这种情况下,只$1包含某些内容(给定的文件名)。

要在脚本中使用给定的文件名,请使用"$1". 要获得更易读的代码,请将其分配给命名的 shell 变量:

./myscript.sh some-file-name
Run Code Online (Sandbox Code Playgroud)

上面的脚本另外验证给定的文件名是否存在并且是一个常规文件(不是例如目录),或者一个到常规文件的有效符号链接。


附带说明:当编写需要用户提供一个或多个文件名的脚本时,最好安排脚本从命令行获取文件名,例如上面的例子。另一种方法是交互地或从文件中读取文件名,对于无法使用 shell 的文件名通配符和/或制表符完成功能来给出正确文件名的用户来说是很尴尬的。也可能无法以交互方式键入某些文件名。


如果您只想要计算文本文件中的单词、字符和行数的功能,那么该wc实用程序已经完成了此操作:

#!/bin/sh

# Pick out the filename given on the command line.
name=$1

# Verify that the given name is indeed a (regular) file,
# or a symbolic link to a regular file.
if [ ! -f "$name" ]; then
    # It's not, so output error message and exit.
    printf 'The given name "%s" is not a regular file!\n' "$name" >&2
    exit 1
fi

printf 'The given filename is "%s"\n' "$name"
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,该文件.zsh_history有 7824 行、35317 个单词和 333801 个字符。

请参阅man wc您的系统上。