Shell脚本太多参数错误[无法使用引号解析]

时间:2014-02-08 03:09:26

标签: shell

我通过命令行从用户那里获得输入,并想要使用$ @

检查是否有输入

用户调用如下方式:

sh program <file1> <file2> ..

sh program < file1

在脚本中我正在执行以下操作:

test -z "$@"  
if test $? -eq 0
then
    compute
else
       do something..
fi

如果用户使用多行调用程序,那么我会收到错误 测试-z&#34; $ @&#34;说&#34;测试:太多的论点&#34;

我试图解决这个问题,但我被困住了。你知道我怎么能克服这个问题吗?

3 个答案:

答案 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