为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕圣8478803 2019-11-21 14:09:37

如果不满足所需的参数计数,我希望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

我究竟做错了什么?


查看完整描述

3 回答

?
慕标琳琳

就像任何其他简单命令一样,[ ... ]或者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 ]]

它还具有其他一些功能,例如无引号的条件分组,模式匹配(带有的扩展模式匹配extglob)和正则表达式匹配。


以下示例检查参数是否有效。它允许一个或两个参数。


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

对于纯算术表达式,使用(( ))一些仍可能会更好,但它们仍然可能在[[ ]]与它的算术运算符喜欢-eq,-ne,-lt,-le,-gt,或-ge通过将表达为一个字符串参数:


A=1

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

如果您还需要将其与其他功能结合使用,那将很有帮助[[ ]]。


退出脚本

在将无效参数传递给脚本时使脚本退出也是合乎逻辑的。这已经提出的意见通过ekangas但有人编辑这个答案与把它-1作为返回值,所以我还不如做是正确的。


-1尽管没有被Bash接受为Bash的参数,但exit没有明确记录,也没有权利用作常见建议。 64也是最正式的值,因为它是在sysexits.hwith中定义的#define EX_USAGE 64 /* command line usage error */。大多数类似的工具ls也会返回2无效的参数。我也曾经返回2过自己的脚本,但是最近我不再真正在意它,只使用1了所有错误。但让我们放在2这里,因为它是最常见的,并且可能不是特定于操作系统的。


if [[ $# -ne 1 ]]; then

    echo "Illegal number of parameters"

    exit 2

fi


查看完整回答
反对 回复 2019-11-21
?
慕侠2389804

如果要处理数字,最好使用算术表达式。


if (( $# != 1 )); then

    echo "Illegal number of parameters"

fi


查看完整回答
反对 回复 2019-11-21
?
慕慕0277861

在[]上:!=,=,== ...是字符串比较运算符,-eq,-gt ...是算术二进制运算符。


我会用:


if [ "$#" != "1" ]; then

要么:


if [ $# -eq 1 ]; then


查看完整回答
反对 回复 2019-11-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信