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

use*_*964 8 linux bash

我最近一直在使用getopts而且我已经把所有东西都搞定了.我有一个问题.我希望它工作,以便如果有人没有在命令行上输入参数,他们会得到帮助文本,例如:

$ ./script
$ help: xyz - argument must be used.
Run Code Online (Sandbox Code Playgroud)

这就是我现在所拥有的.

#!/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
Run Code Online (Sandbox Code Playgroud)

sus*_*tus 9

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

所述-z的选项test返回true,如果下面的-z串的长度是零.

 if [ -z "$1" ]
 then
  helptext
  exit 1
 fi
Run Code Online (Sandbox Code Playgroud)


Gil*_*not 7

尝试在脚本中使用它:

#!/bin/bash

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

# --- the rest of the script ---
Run Code Online (Sandbox Code Playgroud)

代码行是布尔缩短版本的

if [[ $@ ]]; then
    true
else
    helptext
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

$@ 是脚本的所有参数

[[ $var ]]
Run Code Online (Sandbox Code Playgroud)

是一个简写

[[ -n $var ]]
Run Code Online (Sandbox Code Playgroud)

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


mkl*_*nt0 5

吉尔斯·奎诺特的答案很有效,而且非常简洁; 如果您正在寻找更明确表达意图的解决方案,您可以尝试这些基于参数计数的方法$#:

[[ $# -gt 0 ]] || { helptext; exit 1; }
Run Code Online (Sandbox Code Playgroud)

另外,使用算术表达式:

(( $# > 0 )) ||  { helptext; exit 1; }
Run Code Online (Sandbox Code Playgroud)

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

(( $# )) || { helptext; exit 1; }
Run Code Online (Sandbox Code Playgroud)

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

test $# -gt 0 || { helptext; exit 1; }
Run Code Online (Sandbox Code Playgroud)

test/ [ ... ]是一个POSIX实用程序/内置,而类似的[[ ... ]]条件是bash-specific(按原样(( ... ))).
然而,通常bash[[ ... ]]提供了更多的功能,并具有比意外减少test/ [...].