如何检查$*是否为空?换句话说,如何检查命令是否没有提供自变量?

#1 楼

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

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


如果要使用$*(不推荐),则

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


一些解释:

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

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

示例:

$ command param1 param2

这里,

如果未设置IFS,则$#的值为2,$*的值为字符串“ param1 param2”(不带引号)。因为如果未设置IFS,则参数之间用空格分隔。

有关详细信息,请阅读man bash并阅读名为“特殊参数”的主题

评论


或者如果 ! (($#)); ...,或者if(($#== 0));或...,或者如果[$#-eq 0]; ..., 要么 ! ((($#))&& ...,或(($#))|| ...

–nicerobot
2011-12-21 21:13



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

–吉尔斯'所以-不再是邪恶的'
2011年12月2日23:50

如果仅传递了一个“”参数,则“ $ *”表达式也将计算为“”。但是大多数时候您可能还是不会在意。

–manatwork
2011年12月3日,13:15

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

–实际上
2011-12-5 18:02

@Charlotte这意味着您没有使用bash。您正在使用sh执行脚本。 AFAIK ==仅在bash中有效。

– Sachin Divekar
2011-12-5 19:05



#2 楼

如果仅对缺少特定参数的情况感兴趣,则参数替换非常有用:

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

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


#3 楼

这是您可以知道没有任何参数的方法之一

NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
    {do something}
fi


评论


这似乎是一种令人费解的方法,可以解决5年前公认的答案。

– Jeff Schaller♦
16-10-4在10:06