如何避免在 getopt 的`eval set ... "$@"` 中扩展单引号文本?

How to avoid expansion of single-quoted text in the `eval set... "$@"` for getopt?

我正在使用常规模式通过 getopt 执行参数解码:

function mytest {
  eval set -- `getopt --options h --long help -- "$@"`
  echo "1: 2:"
}

但是当我传递一个单引号字符串时,它实际上被扩展了,例如:

$ mytest 'x * z'
1:-- 2:<list of files from current dir>

奇怪的是,似乎只有特定结构 '<string> * <other_strings>' 触发了该行为;类似的结构没有:

$ mytest '* z'
1:-- 2:* z
$ mytest 'x *'
1:-- 2:x *

如何按预期进行评估?

因为你在 eval 中使用,所以除了禁用 globs(扩展发生在命令实际上是 运行 之前),我没有看到其他选项,即:

mytest ()
{
    set -f    # disable file name generation (globbing).
    eval set -- $(getopt --options h --long help -- "${@}")
    echo "1: 2:"
    set +f
}

$ mytest x * z
1:-- 2:x

$ mytest 'x * z'
1:-- 2:x * z

$ mytest ./*
1:-- 2:./config-err-reCeGT

$ mytest "./*"
1:-- 2:./*

引用您的扩展以防止通配:

function mytest {
   eval set -- "`getopt --options h --long help -- "$@"`"
   echo "1: 2:"
}