【问题标题】:Parsing long and short args in ksh using loop使用循环解析 ksh 中的长参数和短参数
【发布时间】:2018-07-22 15:47:10
【问题描述】:

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

问题:如何将option+value设置为一个单元进行解析? 另外,如果 eval set -- $option 对我有帮助,那么我该如何使用它呢? option 上的 echo 未在末尾显示预期的“--”。我假设有什么问题吗?

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

感谢您的时间和帮助。

更新 1: 如指出的那样添加代码。感谢 markp、Andre Gelinas 和 random down-voter 让这个问题变得更好。尝试执行第 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

将使用以下方法捕获参数:

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

【问题讨论】:

  • 嗨,如果有人觉得这个问题没有帮助,我很抱歉。有没有办法改进这个问题?
  • 我猜有人投了反对票,因为......你没有提供你试图解析的例子,也没有你尝试过的任何代码 sn-ps......或者可能是因为快速搜索将显示涵盖同一主题的多个问答(例如,此bash/getops post
  • 您能否发布您尝试过的内容,并附上工作示例。

标签: linux ksh string-parsing getopt


【解决方案1】:

试试这样的:

#!/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

您可以使用--one 或-o。使用 --man 或 --help 也可以。 -o 和 -s 也只是数字,但 -t 可以取任何值。希望对您有所帮助。

【讨论】:

猜你喜欢
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多