为什么我在shell脚本中得到“non -option ARGV element:XXXX”?

时间:2014-01-22 11:57:58

标签: linux shell

我正在尝试创建一个用于登录Linux中的cyberoam客户端的文件。

crclient是一个采用不同参数的文件。 登录./crclient -u username,登出./crclient -l。 我写的shell脚本可以正常登录,但是当我尝试注销时,./crclient -l终端正在显示     non-option ARGV-elements: u09me215

#!/bin/sh
cd Downloads/crclient
if [ $1=="-u" ]
then
./crclient $1 u09me215
else
./crclient $1
fi

现在,在将if [ $1=="-u" ]替换为if [ $1 = "-u" ]作为@devnull指向后,脚本正在正常运行。 但是除了一个之外的“==”和“=”之间的区别是用于比较,而另一个用于值分配。为什么==适用于-u而不适用于-l

1 个答案:

答案 0 :(得分:1)

如果没有空格,$1==-u将被视为单个字符串,而不是比较表达式。由于非空字符串在test命令中始终评估为true,因此最终运行

./crclient -l u09me215

这显然会导致你看到的错误。

从更细微的说明来看,[ $1 == "-u" ]在技术上是不允许的,因为test命令(由POSIX指定)不使用==进行字符串比较。但是,如果您的/bin/sh实际上是bash,那么bash会偏离标准并允许它。你应该使用

[ "$1" = "-u" ]    # Note the quotes around $1

[[ "$1" == "-u" ]]   # A single = would be fine, and quoting $1 is optional but recommended.