【问题标题】:Getops consider my option chain as the argument for the first oneGetops 将我的选项链视为第一个选项链的参数
【发布时间】:2017-04-07 06:51:24
【问题描述】:

下面的代码在subscript.sh中执行,subscript.shprimaryscript.sh里面运行

#### primaryscript.sh
#! /bin/bash
#...
"$bss_path"/subscript.sh "$option"
#...

我正在使用这段代码来解析我的参数及其值:

#### subscript.sh
#! /bin/bash

while getopts "hw:l:s:b:" opt; do
  case $opt in
    w)
      x="$OPTARG";;
    l)
      xx="$OPTARG";;
    s)
      xxx="$OPTARG";;
    b)
      xxxx="$OPTARG";;
    h)
      print_usage
      exit 0;;  
    \?)
      echo "Invalid option: -$OPTARG"
      exit 1;;
  esac
done

当我用多个参数调用我的脚本时出现问题:

./myscript -l 5.0.3-0 -s 4.0-0 -b 010

getops 认为选项 l5.0.3-0 -s 4.0-0 -b 010 作为参数。

我做错了什么? 我试图玩弄: 和选项,但据我所知,我必须将它们放在选项后面,对吗? 而getops自然知道-是参数的分隔符。

$> echo $BASH_VERSION
$> 3.2.25(1)-release

【问题讨论】:

  • 使用 bash 3.1.17(来自 RHEL 5)和 4.2.8(来自 Ubuntu 11.04):如果我将其添加为最后一行,它对我来说很好:echo -e "w: $x\nl: $xx\ns: $xxx\nb: $xxxx"
  • 添加执行这个 scipt 的行并显示这个脚本的 shebang。顺便提一句。您的脚本适用于 bash、sh、dash 和 zsh。
  • 您的问题变得非常不清楚。您可以编辑它,删除“EDIT1” ....段落,然后向我们展示您在调用 getopts 循环之前所做的操作吗?
  • 删除引号:"$option"
  • 哦,快。我怎么能错过这个。非常感谢赛勒斯。

标签: bash shell parsing arguments getopts


【解决方案1】:

它对我有用。您可以通过在 shell 中键入“man bash”并搜索来了解有关 GETOPTS、OPTARG 以及 while 循环和 case 语句的更多信息。

#!/bin/bash

while getopts "hw:l:s:b:" opt; do
  case $opt in
    w)
      x="$OPTARG";;
    l)
      xx="$OPTARG";;
    s)
      xxx="$OPTARG";;
    b)
      xxxx="$OPTARG";;
    h)
      print_usage
      exit 0;;
    \?)
      echo "Invalid option: -$OPTARG"
      exit 1;;
  esac
done

echo $xx
echo $xxxx
echo $xxx

输出:

5.0.3-0
010
4.0-0

【讨论】:

  • 嗯,如果我只使用这段代码,它实际上也适用于我......我很困惑。我编辑了我的问题
  • 虽然这段代码 sn-p 可以解决问题,包括说明 如何为什么 这解决了问题 would really help 以改进你的帖子质量。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
【解决方案2】:

正如赛勒斯在评论中指出的那样,问题在于我如何传递参数。

./myscript "$options"

正确的做法是:

./myscript $options

因为 "$options" 不会关心空格并将整个字符串作为单个参数。

【讨论】:

  • 什么是$options,它来自哪里?将选项从一个脚本传递到另一个脚本的正确方法是使用"$@";如果您需要将它们保存在中间变量中,请使用数组而不是简单变量(假设您使用的是 bash 或其他具有数组的 shell。)
  • 我预先使用复杂的逻辑生成脚本的选项,并创建一个包含多个选项的“选项字符串”。我想我没有错,我的错误是将它们作为单个参数而不是多个参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2014-09-14
相关资源
最近更新 更多