【问题标题】:Determining if $@ is not present or empty确定 $@ 是否不存在或为空
【发布时间】:2018-06-06 18:47:03
【问题描述】:

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

【问题讨论】:

  • 为什么?函数使用不当不是您的问题...如果可以的话,很高兴进行额外检查,但我不确定我会花很多时间在这上面。
  • 为什么不在你的脚本中添加[ -z "${@}" ] && echo "Missing parameters..." && exit 1
  • 旁注:你应该几乎总是使用"$@"而不是$@,否则扩展会受到分词和路径名扩展的影响。
  • 为什么不在脚本中添加[ -z "${@}"] && echo "Missing parameters..." && exit 1 来检查参数是否为空。
  • @PaulHodges 这实际上是我的问题。我为与我一起工作的人编写脚本,当他们不正确使用时,我大部分时间都是解决问题的人,所以我有必要让它们尽可能地证明白痴。

标签: bash arguments


【解决方案1】:

您可以在参数解析器中执行此操作 (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>

【讨论】:

  • 花了我一点时间来理解你在说什么以及它是如何工作的,但这实际上比我想要的要好。谢谢。
【解决方案2】:

你可以这样做

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

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

【讨论】:

  • 问题是$@之前还有其他参数传递给函数。我最初有你的设置,但我试图区分用户何时不将参数传递给程序,以及程序员没有正确编码以将参数传递给函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 2014-08-05
  • 2022-06-22
  • 2012-07-29
相关资源
最近更新 更多