我通过命令行从用户那里获得输入,并想要使用$ @
检查是否有输入用户调用如下方式:
sh program <file1> <file2> ..
或
sh program < file1
在脚本中我正在执行以下操作:
test -z "$@"
if test $? -eq 0
then
compute
else
do something..
fi
如果用户使用多行调用程序,那么我会收到错误 测试-z&#34; $ @&#34;说&#34;测试:太多的论点&#34;
我试图解决这个问题,但我被困住了。你知道我怎么能克服这个问题吗?答案 0 :(得分:3)
问题是如下:
test -z "$@"
如果用户使用多个参数运行脚本,则最终等同于:
test -z "arg1" "arg2" "arg3"
这就是为什么你得到“太多参数”的错误。有关详细信息,请阅读bash(1)
手册页“参数”部分的“特殊参数”小节。您真正想要检查的可能是$#
,即传递给您脚本的参数数量:
if test $# -eq 0
then
compute
else
do something..
fi
但你也可以对$*
进行测试,$@
扩展到命令行参数,但是作为单个字符串:
if test -z "$*"
then
compute
else
do something..
fi
答案 1 :(得分:1)
$#
为您提供参数数量。
if (($# > 0)); then
echo "passed $# arguments: $@"
else
echo "no arguments"
fi
答案 2 :(得分:0)
$?是shell退出状态变量。如果要检查输入的最后一个命令是以true还是false执行,方法是返回0表示其他命令的真值和非零值。
$#是shell变量,显示用户传递的参数数量。并且您可以使用变量$ 0,$ 1最多$ 9来访问这些参数,其中$ 0变量带有命令名称,因此您将使用起始$ 1。
实施例
if test $# -gt 0
then
echo "You pass $# Arguments";
echo "First Argument is : $1";
echo "Second Argument is : $2";
else
echo "You did not pass any Arguments";
fi