Bash如何检测传递给脚本的缺少的必需参数

时间:2013-11-07 17:25:23

标签: bash

我有一个Bash脚本,我需要传递一定数量的参数才能使其正常工作。

./upload.sh $ARG1 $ARG2 $ARG3

假设2个必填字段是ARG1和ARG2,以及
ARG1和3不为空。

我认为脚本会运行并认为它有2个必需参数, 有没有办法检测到ARG2缺失/空? 我需要返回退出1而不是退出0。

这是一些脚本

RESOURCE=$1
CONTAINER=$2
APP_NAME=$3

if [[ -z $RESOURCE || -z $CONTAINER ]];
then
    echo `date`" - Missing mandatory arguments: resource and container. "
    echo `date`" - Usage: ./upload.sh  [resource] [container] [appname] . "
    exit 1
fi

提前致谢,

阿兰

5 个答案:

答案 0 :(得分:3)

我总是使用一个小函数来检查所有参数:

process_arguments() {
    while [ -n "$1" ]
    do
        case $1 in
            -h|--help) echo "some usage details"; exit 1;;
            -x) do_something; shift; break;;
            -y) do_something_else; shift; break;;
            *) echo "some usage details"; exit 1;;
        esac
        echo $1; shift
    done
}

这样,如果您遗漏任何内容,将显示正确的使用详细信息,脚本将退出。否则,您可以按任何顺序输入args。脚本启动后,只需调用

即可
process_arguments "$@"

你应该全力以赴。

答案 1 :(得分:1)

  

有没有办法检测到ARG2缺失/空?

NO。你传递参数的方式,将被解释为参数1和2。

你可以说:

./upload.sh "$ARG1" "$ARG2" "$ARG3"

为了使bash正确解释这些参数是否为空。


示例:

$ cat file
[ -z $1 ] && echo "Arg 1 missing"
[ -z $2 ] && echo "Arg 2 missing"
[ -z $3 ] && echo "Arg 3 missing"
$ bash file "$HOME" "$FOOBAR" "$USER"
Arg 2 missing

(变量FOOBAR在上面的示例中未定义。)

答案 2 :(得分:1)

你使用它们时的Args是位置的,所以你只提供1和3,但需要1和2,你只是意外地为arg 3提供了arg 2的值。

您可以要求您的可选参数以短划线开头 - 如果您发现$ 1或$ 2以短划线开头,则表示您缺少必需参数。你当然必须从$ 3中删除破折号。

处理args的更好方法是使用getopts。以下是一些可以帮助您入门的资源:

这将允许您以类似于标准命令行工具的方式处理args。如果你在C中编写命令行工具,你可能以前使用过c语言版的getops。

答案 3 :(得分:1)

我喜欢:

VARNAME=${1:?"missing arg 1 for VARNAME"}

答案 4 :(得分:0)

  

我认为脚本会运行并认为它有2个必需参数,有没有办法检测到ARG2缺失/空?

除非ARG2

,否则

  • 具有一些可识别的结构,例如URL,电子邮件或银行帐户可以拥有或
  • 是一个对象的命名,其存在可以像文件,文件中的条目等一样进行测试。

如果上述任何一种情况成立,您可以编写一段代码来确定ARG2是否真的与CONTAINER对应,或者最有可能是APP_NAME

如果没有,您将需要

  • 强制要求第三个参数
  • 放弃使用位置参数来支持命名参数,例如./upload.sh --resource blah --container blahblah --appname blablahblah,方便的getopts