当前位置: 首页 > 知识库问答 >
问题:

在bash中将getopts选项自动解析为同名动态变量

骆昊阳
2023-03-14

我写了一个bash脚本,有3个命令行选项,bib,bob和boo...我想将用户选项读入一个同名的bash变量,如下所示:

PARSED_OPTIONS=$(getopt -n $0  --long "bib:,bob:,boo:"  -- "$@")

eval set -- "$PARSED_OPTIONS";

while true; do
  case "$1" in

  --bib)
  bib=$2
  shift 2;;

  --bob)
  bob=$2
  shift 2;;

  --boo)
  boo=$2
  shift 2 ;;

  --)
  shift
  break;;

  esac
done

这一切都很好,到目前为止,很好。。。

但是现在我想把它扩展到一个包含许多选项的列表,所以与其写出一个很长的case语句,不如能够以某种方式循环一个选项列表并自动将选项传递给变量,沿着这些思路,这将是非常好的。

opts="bib:,bob:,boo:," 

PARSED_OPTIONS=$(getopt -n $0  --long $opts -- "$@")

for arg in `echo $opts | tr , " "` ; do 
  eval set -- "$PARSED_OPTIONS";
  while true; do

    case "$1" in
      --${arg})
      declare $arg=$2
      shift 2
      ;;
      --)
      shift
      break;;
    esac
  done
done

我使用声明语句将参数放入一个同名的动态变量中(请参阅Bash第二个解决方案中的动态变量名),这个解决方案通过逗号分隔的shell变量在逗号分隔的列表上循环,但我在这里得到了一个无限循环。我认为这两个未使用的选项是允许的,因为它们在PARSED_options列表中,但它们在循环中没有被切掉,因为只查找“arg”…我看不到明显的解决方法,但我肯定有一个。

共有1个答案

祖波光
2023-03-14

我意识到我的shift命令仍然在case语句中,所以这就是它没有退出的原因。我还需要从参数中去掉冒号:,所以下面是我对bash脚本的自动参数检索:

# specify an arbitrary list of arguments:

opts=bib:,bob:,boo:

PARSED_OPTIONS=$(getopt -n $0  --long "${opts}"  -- "$@")

for arg in ${opts//,/ } ; do 
  var=${arg//:} # remove the colon
  eval set -- "$PARSED_OPTIONS";
  while true ; do
    case "$1" in
      --${var})
      declare ${var}=$2
      ;;
    --)
      break
      ;;
    esac
    shift 2
  done
done

所以如果你尝试test_script--boo3--bib你好--bob lkkfrfrfr

echo $bib $bob $boo

应该给

hello lkkfrfrfr 3
 类似资料:
  • 我对bash脚本感到困惑。 我有以下代码: 我希望能够创建一个变量名称,其中包含命令的第一个参数并带有例如的最后一行的值。 为了说明我想要什么: 那么,我应该如何定义/声明,我应该如何在脚本中调用它? 我试过、、,但我仍然感到困惑。

  • 问题内容: 我有一个json对象是这样的: 我试图这样解析: 但是我不知道如何访问动态名称。我们如何解析这样的JSON -注意-Ya的 所有值都带有引号,例如:“ Yg&R_” 问题答案: 试试这个动态的JSON解析器

  • 我想使用在数据帧中创建多个新列。列名及其内容应动态生成。 来自IRIS的示例数据: 我创建了一个函数来从变量中更改新列:

  • 我想使用<code>dplyr::mutate()</code>在数据帧中创建多个新列。应动态生成列名及其内容。 来自iris的示例数据: 我创建了一个函数,可以从<code>Petal中修改我的新列。宽度变量: 现在我创建一个循环来构建我的列: 然而,由于mutate认为varname是一个文字变量名,因此循环只创建一个新变量(称为varname),而不是四个(称为petal.2-petal.5

  • 问题内容: 在PHP中,您可以执行以下令人惊奇/可怕的事情: 有没有办法用Java做类似的事情? 例如,如果我有一个名称,可以得到对变量的引用吗? 问题答案: 由于ECMA-/ JavaScript是所有关于和(其也somekind的对象的),每个变量被存储在这样的被称为 可变 (或在功能方面,的情况下, 激活对象 )。 因此,如果您创建这样的变量: 在 全局范围 (= NO函数上下文)中,您将这

  • 问题内容: 我想使用运行时之前不知道的字段名称过滤器来调用查询…不确定如何构造变量名称…或者我很累。 如果funct()返回的名称等于 不知道该怎么做… 问题答案: 您可以创建字典,设置参数,然后通过解压缩字典作为关键字参数将其传递给函数: