BASH - 如果没有命令行参数作为参数传递,则抛出使用警告

Posted

技术标签:

【中文标题】BASH - 如果没有命令行参数作为参数传递,则抛出使用警告【英文标题】:BASH - Throw usage warning if no command line parameter is passed as an argument 【发布时间】:2017-07-19 01:04:56 【问题描述】:

我找到了here 的答案,该答案是关于计算传递给BASH 脚本的参数数量的问题。我对: $1?"Usage: $0 ARGUMENT" 行感兴趣,如果没有给出参数,它会抛出警告。

现在我想使用: $1?"Usage: $0 ARGUMENT" 调用一个用法函数Usage,但我不知道该怎么做。我试过: $1?UsageBASH 在这条线上抛出一个错误。有人能建议如何使用 this 调用函数吗?

示例脚本如下,

#!/bin/bash

function Usage() 
    echo "Usage: $0 [-q] [-d]"
    echo ""
    echo "where:"
    echo "     -q: Query info"
    echo "     -d: delete info"
    echo ""


# Exit if no argument is passed in
: $1?Usage

while getopts "qd" opt; do
    case $opt in
        q)
            echo "Query info"
            ;;
        d)
            echo "Delete info"
            ;;
        *)
            Usage;
            exit 1
            ;;
    esac
done

【问题讨论】:

@hek2mgl,用伪代码更新了问题。 你为什么不能在getopts 本身中处理这个?,这个参数意味着哪个标志? @Inian 需要 qd 时,检查 $1 是有意义的。 AFAIK getopts 无法说出 qd 是必需的。但是,我们可能会在 getopts 中设置一个变量,然后再检查它。将其添加到我的答案中。 一般来说,你不应该在while循环中真正采取任何动作;只需记录存在哪些选项。 while 循环之后,如果您确定没有使用任何选项,则可以打印使用消息并退出。 (在仔细阅读之后,这正是 hek2mgl 在他的答案后半部分所做的......) 【参考方案1】:

这个呢?

function Usage() 
    echo "Usage: $0 [-q] [-d]"
    echo ""
    echo "where:"
    echo "     -q: Query info"
    echo "     -d: delete info"
    echo ""


# Exit if no argument is passed in
: $1?"$(Usage)"

无论如何,我认为这更具可读性:

if [ $# -lt 1 ] ; then
    Usage
fi

另一个想法是这样处理它:

mode=""
while getopts "qdh" opt; do
    case $opt in
        q)
            mode="Query info"
            ;;
        d)
            mode="Delete info"
            ;;
        h)
            Usage
            exit 0
            ;;
        *)
            Usage >&2
            exit 1
            ;;
    esac
done

if [ -z "$mode" ] ; then
    Usage >&2
    exit 1
fi

【讨论】:

getopts 不会打印使用信息。 @hek2mgl 感谢您的意见。我可以使用: $1?"$(Usage)" 打印使用信息,但您的第二个建议更具可读性。我想试试这个: $1?"$(Usage)",看看它是如何工作的,因为语法对我来说是新的。 @Inian 就个人而言,当涉及到更复杂的命令行参数时,我会选择一种不同的编程语言。但是,是的,您还可以根据getopts 的结果打印使用信息,如果您想正确处理选项的参数而不是只检查参数的数量,您甚至需要这样做。再次,我推荐Python。 :) @hek2mgl:感谢,++ 用于演示表单中的用法,$1?"$(Usage)"(之前未使用) @Inian 我不推荐它,只是建议正确的语法。【参考方案2】:

您只需将参数传递给 bash 脚本。 假设 bash 脚本的名称是 hello.sh; 例如:

    #!/bin/bash
    # script's name is hello.sh
    : $1?"Usage: $0 Argument"
    echo hello,$1

然后chmod a+x hello.sh

然后我们调用脚本使用这个: bash hello.sh yourname 然后回显“你好,你的名字” 如果您刚刚调用使用 bash hello.sh 并且此脚本没有参数 你会收到这样的错误消息Usage: hello.sh Argument

【讨论】:

以上是关于BASH - 如果没有命令行参数作为参数传递,则抛出使用警告的主要内容,如果未能解决你的问题,请参考以下文章

bash:以空格作为参数传递路径?

将可变数量的 bash 命令行参数传递给 MATLAB 函数

Bash 命令行和输入限制

在bash中将数组作为参数传递

随机单词 Bash 脚本,如果提供一个数字作为第一个命令行参数,那么它将仅从具有那么多字符的单词中选择

在 Bash 中传递 -e 和 -n 作为位置参数