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?Usage
和BASH
在这条线上抛出一个错误。有人能建议如何使用 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 需要 q
或 d
时,检查 $1 是有意义的。 AFAIK getopts
无法说出 q
或 d
是必需的。但是,我们可能会在 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 命令行参数传递给 MATLAB 函数