shell Getopts将我的期权链视为第一个期权链的参数

shyt4zoc  于 2022-12-13  发布在  Shell
关注(0)|答案(2)|浏览(144)

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

getopts认为选项l具有5.0.3-0 -s 4.0-0 -b 010作为自变量。
我做错了什么?
我试着玩:和选项,但正如我所理解的,我必须把它们放在选项后面,对吗?
getopts自然知道-是参数的分隔符。

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

q3aa05251#

正如Cyrus在评论中指出的,问题在于我如何传递参数。

./myscript "$options"

正确的做法是:

./myscript $options

因为“$options”不会考虑空格,而是将整个字符串作为单个参数。

nqwrtyyt

nqwrtyyt2#

它对我很有效。你可以通过在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

相关问题