10

我有一个 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

提前致谢,

阿兰

4

5 回答 5

6

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

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 "$@"

你应该准备好了。

于 2014-09-03T17:52:17.730 回答
5

我喜欢:

VARNAME=${1:?"missing arg 1 for VARNAME"}
于 2021-05-13T19:20:13.927 回答
2

有没有办法检测 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未定义。)

于 2013-11-07T17:35:09.063 回答
1

你使用的参数是位置参数,所以你只提供了 1 和 3,但 1 和 2 是必需的,你只是不小心将 arg 3 的值提供为 arg 2。

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

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

这将允许您以类似于标准命令行实用程序的方式处理 args。如果您在 C 中编写命令行实用程序,您可能以前使用过 C 库版本的 getops。

于 2013-11-07T17:35:16.157 回答
0

我认为脚本会运行并认为它有 2 个强制参数,有没有办法检测 ARG2 丢失/为空?

ARG2没有,除非

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

如果上述任何一项成立,您可以编写一段代码来确定是否ARG2真的对应于 aCONTAINER或最有可能是 aAPP_NAME

如果没有,您将需要

  • 使第三个参数成为强制性
  • 放弃使用位置参数来支持命名参数,例如./upload.sh --resource blah --container blahblah --appname blablahblah,使用方便的getopts.
于 2013-11-07T20:17:04.543 回答