有效比较如果变量存在且不相等

Pil*_*ila 5 shell scripting busybox

我的sh脚本语法有问题。我为我的华硕路由器写了一个脚本。该脚本完美运行。但我有这条线:

if [[ "$OldIP" && "$StartIP" != "$OldIP" ]]; then echo OK; fi
Run Code Online (Sandbox Code Playgroud)

echo OK只有当$StartIP$OldIP不相同时,它才应该是真的(和执行)。这条线有效,但我希望看到它更有效地完成。变量包含有效的 IP 地址。

在某些情况下,$OldIP不会分配任何东西(未初始化)。但是,如果$OldIP不存在,这意味着它们在我的外壳中不一样!

我不希望该行执行: if$OldIP不存在 -> 测试它们是否不同 -> run echo OK

我确实希望该行表示:a) 如果$OldIP不存在 -> 结束。加 b) 如果$OldIP存在 -> 测试它们是否不同 -> 运行echo OK

所以,"$OLDIP" &&如果可能的话,我想以某种方式删除 。不是真正的问题;好奇学习:)

排序(但它不起作用):

if [ [ "$OldIP" ] != "$StartIP" ]; then echo OK; fi
Run Code Online (Sandbox Code Playgroud)

或者

if [ $OldIP != "$StartIP" ]; then echo OK; fi
Run Code Online (Sandbox Code Playgroud)

它做我想要的,但在OldIP为空时抱怨(但工作正常)

尽管

if [ "$OldIP" != "$StartIP" ]; then echo OK; fi
Run Code Online (Sandbox Code Playgroud)

有效但忽略OldIP为空

ssh*_*ksh 0

我认为你的脚本非常有效。您当然不会在这方面花费很多周期。

另一种编写逻辑的方法:

{ test -n "$OldIP" || test "$StartIP" != "$OldIP"; } && echo OK
Run Code Online (Sandbox Code Playgroud)

这表示“如果设置了 OldIP 或者 OldIP 和 StartIP 不同,则回显 OK。

请记住,这是您可以使用 阅读的[另一个名称。test(1)man 1 test

编辑:正如 Gilles 指出的那样,请注意避免( ... )在不需要的地方创建子 shell。

{ ... ; }可用于对命令进行分组,而无需执行新的 shell。

简要参考:http://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html