确定$ @是否不存在或为空

时间:2018-06-06 18:47:03

标签: bash arguments

我有一个函数get_flags,我用它来解析参数。我在我要解析信息的文件中找到它,然后使用$@将变量从主程序传递给函数。

它看起来像这样

myprogram.sh

source arg_parser.sh
get_flags some_arguments more_arguments $@

我想要一种方法来确定没有参数传递和程序员最后忘记$@的时间之间的区别。或者更好的方法是自动包含$@

例如

myprogram.sh -f flag1 -a flag2

#inside the program
get_flags some_arguments more_arguments #$@ has values, but was forgotten

myprogram.sh #no arguments

#inside the program
get_flags some_arguments more_arguments $@  # $@ is present but empty

2 个答案:

答案 0 :(得分:2)

您可以在参数解析器(libfile.bash)中执行此操作:

__args=("$@")

myfunc () {
    echo "The positional parameters handed to the function:"
    printf '<%s>\n' "$@"

    echo "The global positional parameters:"
    printf '<%s>\n' "${__args[@]}"
}

由于它的来源,它可以访问我们读入数组__args的全局位置参数,因为在myfunc内,$@指的是函数的位置参数。

现在,在您的脚本(script)中,您可以像这样使用解析器:

#!/usr/bin/env bash

. libfile.bash
myfunc localarg1 localarg2

从命令行使用时如下

./script globalarg1 globalarg2

你会得到这个输出:

The positional parameters handed to the function:
<localarg1>
<localarg2>
The global positional parameters:
<globalarg1>
<globalarg2>

证明您可以从函数中访问全局位置参数。

如果您希望myfunc自动将全局位置参数附加到本地参数,您可以执行类似

的操作
__args=("$@")

myfunc () {
    set -- "$@" "${__args[@]}"
    echo "The positional parameters in the function:"
    printf '<%s>\n' "$@"
}

你会得到

 ./script global1 global2
The positional parameters in the function:
<localarg1>
<localarg2>
<global1>
<global2>

答案 1 :(得分:0)

您可以执行类似

的操作
if [ "$1" == "" ]; then
    printf "\\nUsage: Put your usage here \\n"
    exit 1
fi

那将检查第一个参数($ 1)是否为空(“”),如果是,那么它将打印脚本的使用,然后以错误代码(1)而不是(0)退出,这是一个安静的出口。