首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析不适用于getopt的长命令行参数

解析不适用于getopt的长命令行参数
EN

Stack Overflow用户
提问于 2021-05-04 17:03:03
回答 1查看 37关注 0票数 0

作为当前项目的一部分,我希望解析大型脚本的长命令行参数。我以前从来没有尝试过getopt,但我想第一次尝试让脚本看起来更整洁。

在尝试将getopt推送到那个大型项目脚本之前,我想先在示例脚本中检查它。

在下面的示例脚本中,可以很好地解析短命令行参数,但不能解析长命令行参数:

代码语言:javascript
运行
复制
#!/bin/bash

options=$(getopt -o d:f:t: -l domain -l from -l to -- "$@")

[ $? -eq 0 ] || { 
    echo "Incorrect options provided"
    exit 1
}

eval set -- "$options"

while true; do
    case "$1" in
    -d|--domain)
        DOMAIN=$2;
        shift
        ;;
    -f|--from)
        FROM=$2;
        shift
        ;;
    -t|--to)
        TO=$2;
        shift
        ;;
    --)
        shift
        break
        ;;
    *)
        echo "Invalid options!!";
        exit 1
        ;;
    esac
    shift
done

echo "Domain is $DOMAIN"
echo "From address is $FROM"
echo "To address is $TO"
exit 0;

输出:

代码语言:javascript
运行
复制
# ./getopt_check.bash -d hello.com -f from@test.com -t to@test.com
Domain is hello.com
From address is from@test.com
To address is to@test.com

# ./getopt_check.bash --domain hello.com -f from@test.com -t to@test.com
Invalid options!!

# ./getopt_check.bash --domain hello.com --from from@test.com --to to@test.com
Invalid options!!

在解析长命令参数时,我也希望得到相同的输出:

代码语言:javascript
运行
复制
Domain is hello.com
From address is from@test.com
To address is to@test.com

调试时:

代码语言:javascript
运行
复制
# bash -x getopt_check.bash --domain hello.com -f from@test.com -t to@test.com
++ getopt -o d:f:t: -l domain -l from -l to -- --domain hello.com -f from@test.com -t to@test.com
+ options=' --domain -f '\''from@test.com'\'' -t '\''to@test.com'\'' -- '\''hello.com'\'''
+ '[' 0 -eq 0 ']'
+ eval set -- ' --domain -f '\''from@test.com'\'' -t '\''to@test.com'\'' -- '\''hello.com'\'''
++ set -- --domain -f from@test.com -t to@test.com -- hello.com
+ true
+ case "$1" in
+ DOMAIN=-f
+ shift
+ shift
+ true
+ case "$1" in
+ echo 'Invalid options!!'
Invalid options!!
+ exit 1

这里,问题是传递case switch还是choice -d|--domain

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-04 17:33:10

我猜这是你的getopt语法。使用:

getopt -o d:f:t: -l domain:,from:,to: -- "$@"

而不是:

getopt -o d:f:t: -l domain -l from -l to -- "$@"

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67381742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档