命令行选项解析

Jie*_*eng 3 command-line options

对于我的学校项目,我必须实现一个 shell/终端应用程序。但我想知道如何解析命令行选项,因为它看起来有点奇怪。例如对于命令 paste (我相信其他实用程序的行为类似)

[jiewmeng@JM tmp]$ paste --help
Usage: paste [OPTION]... [FILE]...
Run Code Online (Sandbox Code Playgroud)

将多个选项组合为一个时的行为

[jiewmeng@JM tmp]$ paste -ds file1
file1 xxx
file1
d aaws dafd a
Run Code Online (Sandbox Code Playgroud)

这里似乎选项被忽略了......

[jiewmeng@JM tmp]$ paste -sd file1
Run Code Online (Sandbox Code Playgroud)

它的行为与paste -, 等待相同stdin。但是当它的有效组合

[jiewmeng@JM tmp]$ paste -sd. file1
file1 xxx.file1.d aaws dafd a
Run Code Online (Sandbox Code Playgroud)

有用。无效的不应该给出错误而不是等待stdin吗?

[jiewmeng@JM tmp]$ paste -d
paste: option requires an argument -- 'd'
Try 'paste --help' for more information.
Run Code Online (Sandbox Code Playgroud)

好的,有道理d需要争论,但是......

[jiewmeng@JM tmp]$ paste -d file1
Run Code Online (Sandbox Code Playgroud)

……等等stdin。为什么?

slm*_*slm 8

我发现查看现有的工具体以尝试了解命令行参数的工作方式通常会令人困惑。

你为什么会问?

嗯,在很多情况下,给定命令行工具的作者向用户提供对他们的工具最有意义的命令行参数。因此,这些选项可能相当复杂和令人困惑,直到您了解它们为止。

不要误会我的意思,了解选项的不同呈现方式是件好事,但是在开始时,最好从用于解析命令行参数的实际工具开始,例如getopts.

获取选项

因此getopts,如果您想了解在构建需要解析参数的 shell 脚本时如何解析自己的命令行参数,我建议您查看一下,它包含在 Bash 中。

例子

#!/bin/sh

# Initialize our own variables:
output_file=""
verbose=0

OPTIND=1 # Reset is necessary if getopts was used previously in the script.
         # It is a good idea to make this local in a function.

while getopts "hvf:" opt; do
    case "$opt" in
        h)
            show_help
            exit 0
            ;;
        v)  verbose=1
            ;;
        f)  output_file=$OPTARG
            ;;
        '?')
            show_help >&2
            exit 1
            ;;
    esac
done
shift $((OPTIND-1)) # Shift off the options and optional --.

echo "verbose=$verbose, output_file='$output_file', Leftovers: $@"

# End of file
Run Code Online (Sandbox Code Playgroud)