代码之家  ›  专栏  ›  技术社区  ›  jeffpkamp

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

  •  0
  • jeffpkamp  · 技术社区  · 6 年前

    我有一个功能, get_flags ,用于分析参数。我把它放在要解析信息的文件中,然后使用 $@ .

    看起来像这样

    MyStudio.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 回复  |  直到 6 年前
        1
  •  2
  •   Benjamin W.    6 年前

    你可以在参数分析器中这样做( 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>
    

    演示您可以从函数中访问全局位置参数。

    如果你愿意 米芬克 要自动将全局位置参数附加到本地参数,可以执行以下操作

    __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>
    
        2
  •  0
  •   John Kugelman    6 年前

    你可以这样做

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

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