8

我最近一直在使用 getopts 并且我已经设置了所有内容。不过我有问题。我希望它能够工作,这样如果有人没有在命令行上输入参数,他们就会得到帮助文本,例如:

$ ./script
$ help: xyz - argument must be used.

这就是我目前所拥有的。

#!/bin/bash

function helptext {
    # ...
}

function mitlicense {
    # ...
}


while getopts "hl" opt; do
  case $opt in
    h) helptext >&2
      exit 1
    ;;
    l) mitlicense >&2
      exit 0
    ;;
    \?) echo "Invalid option: -$OPTARG" >&2
      exit 1
    ;;
    :) echo "Option -$OPTARG requires an argument." >&2
      exit 1
    ;;
    *) helptext >&2
      exit 1
    ;;
  esac
done
4

3 回答 3

9

使用 if 测试验证用户输入,如下所示。

如果 -z 后面的字符串的长度为零,则该-z选项返回 true。test

 if [ -z "$1" ]
 then
  helptext
  exit 1
 fi
于 2013-04-20T13:00:09.353 回答
7

尝试在您的脚本中使用它:

#!/bin/bash

[[ $@ ]] || { helptext; exit 1; }

# --- the rest of the script ---

这行代码是布尔缩短的版本

if [[ $@ ]]; then
    true
else
    helptext
    exit 1
fi

$@是脚本的所有参数

[[ $var ]]

是的简写

[[ -n $var ]]

请参阅http://mywiki.wooledge.org/BashGuide/TestsAndConditionals

于 2013-04-20T12:57:35.717 回答
5

Gilles Quenot 的回答效果很好而且非常简洁;如果您正在寻找更明确地表达意图的解决方案,您可以尝试这些基于参数计数$#的解决方案:

[[ $# -gt 0 ]] || { helptext; exit 1; }

或者,使用算术表达式:

(( $# > 0 )) ||  { helptext; exit 1; }

最后,依赖于 0 评估为 false 和任何非零数为 true 的简写:

(( $# )) || { helptext; exit 1; }

William Pursell提供了另一种变体,它既具有描述性又符合 POSIX:

test $# -gt 0 || { helptext; exit 1; }

test/[ ... ]是 POSIX 实用程序/内置的,而类似的[[ ... ]]条件是bash- 特定的(as is (( ... )))。
然而,一般来说,bash'[[ ... ]]提供更多的功能并且比test/更少的惊喜[...]

于 2013-04-20T13:33:37.677 回答