如何检查命令是否没有参数?


Answers:


110

要检查命令是否没有提供参数,请检查$#变量的值,

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi

如果您想使用$*不是首选),

if [ "$*" == "" ]; then
    echo "No arguments provided"
    exit 1
fi

一些解释:

第二种方法不是可取的,因为在位置参数扩展中*,从一个开始扩展到位置参数。当在双引号内进行扩展时,它将扩展为一个单词,每个参数的值由IFS特殊变量的第一个字符分隔。这意味着将构造一个字符串。因此有额外的开销。

另一方面#扩展到位置参数的数量。

例:

$ command param1 param2

这里,

的值$#是2和值的$*是字符串“参数1参数2”(没有引号),如果IFS未设置。因为如果未设置IFS,则参数之间用空格分隔

有关更多详细信息man bash,请阅读名为特殊参数的主题。


5
if ! (($#)); ...或或if (($# == 0)); ...if [ $# -eq 0 ]; ...! (($#)) && ...(($#)) || ...
nicerobot 2011年

7
[ $# -eq 0 ]是IME最常见的形式。在某些情况下"$#"可以为空:如果有一个参数为空,或者有多个空参数$IFS为空。
吉尔斯

1
如果仅传递了一个参数,该"$*"表达式还将求值。但是大多数时候您可能根本不会在意。""""
manatwork 2011年

我认为应该是=而不是== ...目前我遇到了意外的运算符错误,将其更改为=可解决此问题。
实际上是

@Charlotte表示您没有使用bash。您正在sh用来执行脚本。AFAIK ==仅在中有效bash
2011年

14

如果只对缺少特定参数的情况感兴趣,那么“ 参数替换”非常有用:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.