如何使用getopts在命令行中传递shell脚本强制和可选标志?

时间:2016-08-29 15:31:01

标签: shell command-line-arguments getopts

我想用getopts将3个参数传递给我的shell脚本。该脚本至少需要前2个,第三个参数是可选的。如果未设置,则使用其默认值。所以以下两者都有效:

sh script.sh -a "/home/dir" -b 3
sh script.sh -a "/home/dir" -b 3 -c "String"

我尝试按照以下方式执行此操作,但它会不断忽略我输入的参数。

usage() {
 echo "Usage: Script -a <homedir> -b <threads> -c <string>"
  echo "options:"
                echo "-h      show brief help"

  1>&2; exit 1;
}

string="bla"

while getopts h?d:t:a: args; do
case $args in
    -h|\?)
        usage;
        exit;;
    -a ) homedir=d;;
    -b ) threads=${OPTARG};;
    -c ) string=${OPTARG}
        ((string=="bla" || string=="blubb")) || usage;;
    : )
        echo "Missing option argument for -$OPTARG" >&2; exit 1;;
    *  )
        echo "Unimplemented option: -$OPTARG" >&2; exit 1;;
  esac
done

我刚接触这个getopts,之前我只是按照特定的顺序添加参数,我不想在这里做。我在这里已经阅读了很多问题,但不幸的是没有找到我需要它的方式。

我真的很想在这里帮助你。感谢:)

1 个答案:

答案 0 :(得分:4)

您的脚本中有几处错误。最重要的是,$args仅包含选项的字母,没有前导短划线。您为getopts(h?d:t:a:)提供的选项字符串也不适合您实际处理的选项(h?a,{{1} },b)。以下是循环的更正版本:

c