$*
是否为空?换句话说,如何检查命令是否没有提供自变量?#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
并阅读名为“特殊参数”的主题#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
评论
或者如果 ! (($#)); ...,或者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