【linux编程】函数getopt

函数getopt

在使用 getopt 解析命令行选项时,字符串 "a:b:cd::e" 定义了每个选项的类型以及它们是否需要参数。以下是这些选项的含义:

1. a:

  • 单字符选项: -a
  • 参数: 必须有参数。
  • 示例: -a value-avalue

2. b:

  • 单字符选项: -b
  • 参数: 必须有参数。
  • 示例: -b value-bvalue

3. c

  • 单字符选项: -c
  • 参数: 不需要参数。
  • 示例: -c

4. d::

  • 单字符选项: -d
  • 参数: 可选参数。如果提供参数,它必须紧跟在 -d 选项后,不能有空格。
  • 示例: -d-dvalue

5. e

  • 单字符选项: -e
  • 参数: 不需要参数。
  • 示例: -e

总结

  • 冒号 : 表示选项需要参数。
    • 单个冒号 :(如 a:b:)表示参数是必需的
    • 双冒号 ::(如 d::)表示参数是可选的
  • 没有冒号的选项(如 ce)表示该选项不需要参数。  

1. 位置参数

位置参数(Positional Parameters)是根据它们在命令行中出现的位置来解释的参数。这些参数通常是输入文件名、目录路径、或其他直接传递给程序的数据。

特点

  • 没有前缀:位置参数通常不带任何前缀(如 ---)。
  • 顺序重要:程序根据参数在命令行中出现的顺序来解释它们的意义。
  • 简单直观:位置参数的用途直接从它们的位置推断。

示例

假设你有一个脚本 example.sh,需要两个文件名作为输入:

./example.sh input.txt output.txt
在这个例子中:
  • input.txtoutput.txt 是位置参数。
  • 脚本会根据它们的位置来决定哪个是输入文件,哪个是输出文件。

2. 选项参数

选项参数(Option Parameters)通过标志(通常是 --- 前缀)传递,用于向程序传递一些特定的指令或配置。选项参数可以有一个值(参数)或没有值。

特点

  • 标志前缀:选项参数通常由 --- 引导。
    • 短选项:以单个 - 加一个字符表示,如 -a
    • 长选项:以 -- 加一个单词表示,如 --all
  • 可以有参数:选项参数有时需要附加一个值,例如 -o output.txt
  • 顺序不重要:选项参数的顺序通常无关紧要,只要它们与其参数正确关联。

示例

./example.sh -i input.txt -o output.txt --verbose
 

在这个例子中:

  • -i input.txt 是一个选项参数,其中 -i 是选项,input.txt 是它的值。
  • -o output.txt 同样是选项参数。
  • --verbose 是一个没有值的选项,用于开启详细模式。

总结

  • 位置参数:根据位置传递给程序的参数,顺序很重要。
  • 选项参数:通过标志传递给程序的参数,可以带有或不带有值,顺序通常不重要。

代码实现:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int opt;
    int alpha = 0;
    char *beta = NULL;
    char *charlie = NULL;

    // 使用 getopt 解析选项
    while ((opt = getopt(argc, argv, "ab:c:")) != -1) {
        switch (opt) {
            case 'a':
                alpha = 1;
                break;
            case 'b':
                beta = optarg;
                break;
            case 'c':
                charlie = optarg;
                break;
            default:
                fprintf(stderr, "Usage: %s [-a] [-b beta] [-c charlie] [--] [positional_params...]\n", argv[0]);
                exit(EXIT_FAILURE);
        }
    }

    // 打印解析结果
    printf("Alpha: %s\n", alpha ? "true" : "false");
    printf("Beta: %s\n", beta ? beta : "not set");
    printf("Charlie: %s\n", charlie ? charlie : "not set");

    // 打印位置参数
    printf("Positional Parameters:\n");
    for (int i = optind; i < argc; i++) {
        printf(" - %s\n", argv[i]);
    }

    return 0;
}

 

 

#!/bin/bash

# 使用 getopt 解析选项参数
options=$(getopt -o ab:c:: --long alpha,beta:,charlie:: -- "$@")
eval set -- "$options"

# 初始化选项变量
alpha=false
beta=""
charlie=""

# 解析选项参数
while true; do
    case "$1" in
        -a|--alpha)
            alpha=true
            shift
            ;;
        -b|--beta)
            beta="$2"
            shift 2
            ;;
        -c|--charlie)
            charlie="$2"
            shift 2
            ;;
        --)
            shift
            break
            ;;
        *)
            break
            ;;
    esac
done

# 剩下的就是位置参数
positionals=("$@")

# 显示解析结果
echo "Alpha: $alpha"
echo "Beta: $beta"
echo "Charlie: $charlie"
echo "Positional Parameters: ${positionals[@]}"

# 示例处理逻辑
if [ "$alpha" = true ]; then
    echo "Option Alpha is set."
fi

if [ ! -z "$beta" ]; then
    echo "Beta option is set with value: $beta"
fi

if [ ! -z "$charlie" ]; then
    echo "Charlie option is set with value: $charlie"
fi

echo "Processing positional parameters:"
for param in "${positionals[@]}"; do
    echo " - $param"
done

 

posted @ 2022-05-25 11:59  苏格拉底的落泪  阅读(53)  评论(0)    收藏  举报