Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash如何检测传递给脚本的缺少的强制参数_Bash - Fatal编程技术网

Bash如何检测传递给脚本的缺少的强制参数

Bash如何检测传递给脚本的缺少的强制参数,bash,Bash,我有一个Bash脚本,需要传递一定数量的参数才能使其工作。 /upload.sh$ARG1$ARG2$ARG3 假设这两个必填字段是ARG1和ARG2, ARG1和arg3不为空。 我认为脚本将运行并认为它有两个强制参数, 是否有方法检测ARG2缺失/为空? 我需要返回出口1,而不是出口0 这里有一点脚本 RESOURCE=$1 CONTAINER=$2 APP_NAME=$3 if [[ -z $RESOURCE || -z $CONTAINER ]]; then echo `dat

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

/upload.sh$ARG1$ARG2$ARG3


假设这两个必填字段是ARG1和ARG2,
ARG1和arg3不为空。

我认为脚本将运行并认为它有两个强制参数, 是否有方法检测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
提前感谢,

阿兰

是否有方法检测ARG2缺失/为空

不,按照你传递参数的方式,这些将被解释为参数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
未定义。)

Args在使用时是位置型的,因此您只提供了1和3,但1和2是必需的,您只是意外地为arg 3提供了一个值作为arg 2

您可以要求您的可选参数以破折号开头,如果您发现$1或$2以破折号开头,您知道您缺少必需的参数。当然,你必须从3美元中去掉破折号

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

这将允许您以类似于标准命令行utils的方式处理参数。如果您用C编写命令行UTIL,您可能以前使用过C库版本的getops

我认为脚本将运行,并且认为它有2个必需参数,是否有方法检测ARG2是否丢失/为空

除非
ARG2

  • 具有一些可识别的结构,例如URL、电子邮件或银行帐户,或
  • 是一个对象的名称,该对象的存在可以像文件、文件中的条目等一样进行测试
如果上述任何一项成立,您可以编写一段代码,确定
ARG2
是否真正对应于
容器
,或者很可能是
应用程序名称

如果没有,您将需要

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

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

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
}
这样,如果您遗漏了任何内容,将显示正确的用法详细信息,脚本将退出。否则,您可以按任意顺序输入参数。脚本启动时,只需调用

process_arguments "$@"
你应该准备好了。

我喜欢:

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

阿兰,我下面的回答有用吗?