Linux 使用循环解析ksh中的长参数和短参数

Linux 使用循环解析ksh中的长参数和短参数,linux,ksh,string-parsing,getopt,Linux,Ksh,String Parsing,Getopt,我正在尝试解析ksh中的参数。无法使用与短选项相同的getopt我有两个/三个字符。目前我正在使用for循环。这很愚蠢,但我找不到更好的 问题:如何将option+值设置为一个单元以进行解析? 另外,如果eval set--$选项对我有帮助,那么我该如何使用它?echo on选项未在末尾显示预期的“-”。我是不是想错了什么 我正在考虑使用一个变量来跟踪何时找到一个选项,但这种方法似乎太混乱,没有必要 谢谢你的时间和帮助 更新1: 如前所述添加代码。感谢markp、Andre Gelinas和ra

我正在尝试解析ksh中的参数。无法使用与短选项相同的getopt我有两个/三个字符。目前我正在使用for循环。这很愚蠢,但我找不到更好的

问题:如何将option+值设置为一个单元以进行解析? 另外,如果eval set--$选项对我有帮助,那么我该如何使用它?echo on选项未在末尾显示预期的“-”。我是不是想错了什么

我正在考虑使用一个变量来跟踪何时找到一个选项,但这种方法似乎太混乱,没有必要

谢谢你的时间和帮助

更新1: 如前所述添加代码。感谢markp、Andre Gelinas和random down选民让这个问题变得更好。尝试执行代码第2行和第3行中给出的脚本,或同时传递的任何其他长短选项组合

#!/bin/ksh
# bash script1.sh --one 123 --two 234 --three "some string"
# bash script1.sh -o 123 -t 234 -th "some string"

# the following creates problems for short options. 
#options=$(getopt -o o:t:th: -l one:two:three: "--" "$@")

#Since the below `eval set -- "$options"` did not append "--" at the end
#eval set -- "$options"

for i in $@; do
    options="$options $i"
done
options="$options --"

# TODO capture args into variables
到目前为止,在TODO下尝试了以下代码:

for i in $options; do
    echo $i
done
将使用以下方法捕获args:

while true; do
    case $1 in
        --one|-o) shift; ONE=$1
        ;;
        --two|-t) shift; TWO=$1
        ;;
        --three|-th) shift; THREE=$1
        ;;
        --) shift; break
        ;;
    esac
done

试着这样做:

#!/bin/ksh

#Default value
ONE=123
TWO=456


# getopts configuration
USAGE="[-author?Andre Gelinas <andre.gelinas@foo.bar>]"
USAGE+="[-copyright?2018]"
USAGE+="[+NAME?TestGetOpts.sh]"
USAGE+="[+DESCRIPTION?Try out for GetOps]"
USAGE+="[o:one]#[one:=$ONE?First.]"
USAGE+="[s:second]#[second:=$TWO?Second.]"
USAGE+="[t:three]:[three?Third.]"
USAGE+=$'[+SEE ALSO?\aman\a(1), \aGetOpts\a(1)]'

while getopts "$USAGE" optchar ; do
    case $optchar in
                o)  ONE=$OPTARG ;;
                s)  TWO=$OPTARG ;;
                t)  THREE=$OPTARG ;;
    esac
done

print "ONE = "$ONE
print "TWO = "$TWO
print "THREE = "$THREE
#/bin/ksh
#默认值
一=123
二=456
#getopts配置
用法=“[-author?Andre Gelinas]”
用法+=“[-版权所有?2018]”
用法+=“[+NAME?TestGetOpts.sh]”
用法+=“[+说明?尝试GetOps]”
用法+=“[o:one]#[one:=$one?首先。]”
用法+=“[s:second]#[second:=$2?second.]”
用法+=“[t:three]:[three?Third.]”
用法+=$'[+另请参见?\aman\a(1),\aGetOpts\a(1)]'
而getopts“$USAGE”optchar;做
案例$optchar in
o) 一=OPTARG美元;;
s) 二=$OPTARG;;
t) 三=OPTARG美元;;
以撒
完成
打印“ONE=”$ONE
打印“TWO=”$TWO
打印“3=”$3

您可以使用--one或-o。使用——人或——帮助也是有效的。而且-o和-s只是数字,但是-t可以接受任何东西。希望这能有所帮助。

嗨,如果有人发现这个问题没有帮助,很抱歉。还有什么可以改进的吗?我猜有人被否决了,因为。。。您没有提供您试图解析的内容的示例,也没有提供您试图解析的任何代码片段。。。或者可能是因为快速搜索将显示多个涉及同一主题的Q&a(例如,本),您是否可以发布您尝试过的内容,并附上工作示例。感谢Andre Gelinas提供的见解。了解到短选项不适用于多字符。仍在学习——人或——帮助是如何起作用的。您可能想看看: