如何在bash中检查是否提供了参数?

8

我想查看是否提供了参数。但是我不知道为什么这段代码不起作用。我做错了什么?

   if ![ -z "$1" ]
   then
        echo "$1"
   fi

1
如果你使用 if [ -n "$1" ],代码会更易读。然而,最好使用 $# 来返回参数的数量。 - alvits
另外,考虑使用[[ ... ]]而不是[ ... ] - [[ ... ]] 更加强大并具有更多功能。 因此:[[ ! -z $1 ]][[ -n $1 ]] (在这些情况下使用[[ ... ]]时,您可以但不必为 $1 加上双引号)。 - mklement0
2个回答

17

让我们向shellcheck请教:

In file line 1:
if ![ -z "$1" ]
    ^-- SC1035: You need a space here.

换句话说:

if ! [ -z "$1" ]
then
     echo "$1"
fi

如果根据您的评论,它仍然无法工作,并且您恰好是从一个函数中执行此操作,则函数的参数将掩盖脚本的参数,因此我们必须明确传递它们:

In file line 8:
call_it
^-- SC2119: Use call_it "$@" if function's $1 should mean script's $1.

2
我倾向于写 [ ! -z "$1" ],但我想这只是个人口味的问题。 - Saucier
3
你是不是通过一个函数来做这件事情的? - that other guy
1
如果您在函数中使用它,函数中的$1指的是传递给函数的参数,而不是shell脚本的参数。 - alvits
1
@tash517 当调用函数时,可以通过传递"$@"将Shell脚本接收到的所有参数传递给该函数。假设您的函数名为call_it(),则您将像这样调用它call_it "$@" - alvits
1
@alvits 干杯,它起作用了! :) - tash517
显示剩余3条评论

5
你可以检查给定参数的数量。 $# 表示传递给脚本或函数的参数数量,或包含参数的数组的长度。 如果为零,则没有传递任何参数。 这里有一篇关于位置参数的好文章。
$ cat script
#!/usr/bin/env bash

if (( $# == 0 )); then
    echo "No parameters provided"
else
    echo "Number of parameters is $#"
fi

结果:

$ ./script
No parameters provided
$ ./script first
Number of parameters is 1
$ ./script first second
Number of parameters is 2

如果您想使用函数检查传递给脚本的参数,则需要将脚本参数提供给该函数:
$ cat script
#!/usr/bin/env bash

_checkParameters()
{
    if (( $1 == 0 )); then
        echo "No parameters provided"
    else
        echo "Number of parameters is $1"
    fi
}

_checkParameters $#

这将返回与第一个示例相同的结果。
另外相关的是:什么是特殊的美元符号 shell 变量?

+1 这个答案让你能够区分没有第一个参数(my-command)和第一个参数为显式空字符串(my-command "")的情况。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接