Getops认为我的选择链是第一个的参数

时间:2016-11-23 10:12:24

标签: bash shell parsing arguments getopts

以下代码在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

2 个答案:

答案 0 :(得分:0)

它对我有用。您可以通过在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

答案 1 :(得分:0)

正如赛勒斯在评论中所指出的,问题在于我如何传递论据。

./myscript "$options"

正确的方法是:

./myscript $options

由于“$ options”不关心空格并将整个字符串作为单个参数。