当前位置: 首页 > 知识库问答 >
问题:

检查传递给Bash脚本的参数数

葛航
2023-03-14

如果不满足所需的参数计数,我希望我的Bash脚本打印一条错误消息。

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

由于某种未知的原因,我出现了以下错误:

test: line 4: [2: command not found

我做错了什么?

共有1个答案

伊富
2023-03-14

与任何其他简单命令一样,[...]test要求参数之间有空格。

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

在Bash中,最好使用[[]],因为它不会对其变量进行单词拆分和路径名扩展,除非它是表达式的一部分,否则引用可能是不必要的。

[[ $# -ne 1 ]]
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]

对于纯算术表达式,对某些表达式使用(())可能更好,但在[[]]及其算术运算符(如-eq-ne-lt-le->-ge)中将表达式作为单个字符串参数放置,则仍然可以使用:

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

如果您需要将其与[[]]的其他功能结合起来,那么这将会很有帮助。

请注意,[[]](())是与ifcasewhilefor具有相同解析级别的关键字。

正如Dave所建议的,错误消息最好发送到stderr,这样在重定向stdout时就不会包含在其中:

echo "Illegal number of parameters" >&2

当无效参数传递给脚本时,使脚本退出也是合乎逻辑的。在ekangas的评论中已经建议了这一点,但是有人编辑了这个答案,将-1作为返回值,所以我还是做对了。

-1虽然被Bash接受为exit的参数,但并没有显式的文档记录,也不适合用作常用建议。64也是最正式的值,因为它是在sysexits.h中用#define EX_USAGE 64/*命令行用法错误*/定义的。大多数工具(如ls)也会在无效参数上返回2。我也曾经在我的脚本中返回2,但最近我不再真正关心它了,只是在所有错误中使用1。但让我们将2放在这里,因为它是最常见的,并且可能不是操作系统特定的。

if [[ $# -ne 1 ]]; then
    echo "Illegal number of parameters"
    exit 2
fi
  • bash条件表达式
  • 条件构造
  • 模式匹配
  • 分词
  • 文件名扩展(以前的路径名扩展)
  • 简单命令
 类似资料:
  • 问题内容: 我有一个Linux bash脚本“ myshell”。我希望它读取两个日期作为参数,例如:。我是Java程序员,但不知道如何编写脚本来完成此任务。 脚本的其余部分如下所示: 问题答案: 您在脚本中使用,例如

  • 问题内容: 我有一个名为的MySQL脚本文件,其中包含: 我在MySQL控制台中,如何将参数传递给脚本?这不会转发变量: 问题答案: 您可以使用用户变量来实现您描述的行为。在将变量用作模式标识符而不是数据值时,必须使用准备好的语句,以便可以动态组成查询。 : 调用为

  • 我正在尝试从使用自由式詹金斯构建切换到管道项目。 我喜欢它的许多方面,但我希望我可以使用多分支管道,因为它更适合我们公司,但目前这不是一个选择。 我们目前所做的是创建一个名为

  • 当用作npm脚本参数时,是否可以调用从yargs检索密钥? OSX终端中的用户类型: 执行package.json: 这导致了 只有在package.json中硬编码时,这才有效,但我需要它是可配置的。 正如我所说的,我使用的是args,因为它似乎可以很容易地按名称检索键(与数组相反)。接受建议。 我错过了什么? 更新11-07-2017相关:发送命令行参数到npm脚本 但是,传入命令行OR会产生

  • 问题内容: 我只是从Groovy开始。我在任何地方都找不到如何处理Groovy脚本参数的示例,因此我自己修改了此方法。必须有更好的方法来做到这一点?如果是这样,我正在寻找这种更好的方法,因为我可能忽略了显而易见的方法。 问题答案: 如果您想要的不仅仅是进阶参数解析,还可以使用Groovy CliBuilder来帮助您。它可以帮助您使用命令行标志,可选参数和打印用法说明。 签出CliBuilder的

  • 问题内容: 是否可以通过命令行将参数传递给MySQL脚本? 在此示例中,类似于@start_date的内容: 问题答案: 发现在网络上的答案在这里。 基本上,假设我们要运行以下查询: 我们可以这样传递“ start_date”和“ end_date”: