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

tas*_*517 2 linux bash arguments if-statement echo

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

   if ![ -z "$1" ]
   then
        echo "$1"
   fi
Run Code Online (Sandbox Code Playgroud)

tha*_*guy 6

我们问shellcheck:

In file line 1:
if ![ -z "$1" ]
    ^-- SC1035: You need a space here.
Run Code Online (Sandbox Code Playgroud)

换一种说法:

if ! [ -z "$1" ]
then
     echo "$1"
fi
Run Code Online (Sandbox Code Playgroud)

如果,根据你的评论,它仍然不起作用,你碰巧从一个函数执行此操作,函数的参数将掩盖脚本的参数,我们必须显式传递它们:

In file line 8:
call_it
^-- SC2119: Use call_it "$@" if function's $1 should mean script's $1.
Run Code Online (Sandbox Code Playgroud)

  • @ tash517你是不是有机会从一个函数做的? (3认同)
  • 我倾向于写'[!-z"$ 1"]`,但我想这是一个品味问题. (2认同)

Sau*_*ier 5

您可以检查给定参数的数量。$#表示传递给脚本或函数的参数数量 - 或包含参数的数组的长度。如果它为零,则没有传递任何参数。这是关于位置参数的一般读物。

$ cat script
#!/usr/bin/env bash

if (( $# == 0 )); then
    echo "No parameters provided"
else
    echo "Number of parameters is $#"
fi
Run Code Online (Sandbox Code Playgroud)

结果:

$ ./script
No parameters provided
$ ./script first
Number of parameters is 1
$ ./script first second
Number of parameters is 2
Run Code Online (Sandbox Code Playgroud)

如果您想使用函数检查传递给脚本的参数,那么您必须向函数提供脚本参数:

$ cat script
#!/usr/bin/env bash

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

_checkParameters $#
Run Code Online (Sandbox Code Playgroud)

这将返回与第一个示例相同的结果。

另相关:什么是特殊的美元符号 shell 变量?