我正在尝试创建一个文件,以便在Linux中登录到cyberoam客户端。
crclient是一个接受不同参数的文件。
./crclient -u username表示登录,./crclient -l表示注销。
我编写的shell脚本在登录时运行良好,但是当我试图注销时,终端显示
./crclient -l

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

现在脚本在将non-option ARGV-elements: u09me215替换为@devnull指出的if [ $1=="-u" ]后正确运行。
但是“=”和“=”之间的区别在于,一个用于比较,另一个用于赋值。为什么if [ $1 = "-u" ]==有效而对-u无效。

最佳答案

如果没有空格,$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.

10-04 14:45