如果没有传递参数,如何显示帮助文本

时间:2013-04-20 12:55:20

标签: linux bash

我最近一直在使用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

3 个答案:

答案 0 :(得分:9)

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

如果-z后面的字符串长度为零,则-z的{​​{1}}选项返回true。

test

答案 1 :(得分: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

答案 2 :(得分:5)

Gilles Quenot's answer效果很好,非常简洁;如果您正在寻找更明确地表达意图的解决方案,您可以尝试这些,这些是基于 count 的参数$#

[[ $# -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 - 具体的((( ... )) })。
但是,通常情况下,bash的{​​{1}}提供的功能更多,而且比[[ ... ]] / test的意外更少。