shell中的[多]条件测试

本文最后更新于2015年7月12日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

搜索关键字:
  • shell test and/or
  • shell multi test and/or
参考解答:
推荐使用 && 和 || 将多个简单的测试语句连接起来:

使用了AND和OR的测试语句的返回值是列表中最后一个执行的命令的返回值。

  • 当执行 command1 && command2 时,只有当 command1 执行成功后才会执行 command2 ;
  • 当执行 command1 || command2 时,只有当 command1 执行失败后才会执行 command2 。
使用”[[“关键字(不推荐):

[[ is a new improved version of “test/[“, and is a keyword, not a program. This makes it easier to use, as shown below. [[ is understood by KornShell, Zsh and BASH (e.g. 2.03), but not by other POSIX shell implementations (like posh, yash or dash) or the BourneShell .

[[ 是一个关键字,但只能被 KornShell、Zsh和Bash 所解释,不支持其他的POSIX shell实现,比如:posh、yash、dash或BourneShell,这样的话就不能做到通用,因此不推荐使用。

在 test/[ 中使用-a和-o(不推荐):

测试命令的 AND 和 OR 逻辑操作符是 -a 和 -o :

这里没有 && 和 || 的说法:

In any case, avoid the -a/-o test operators which are deprecated and unreliable in the general case .

尽量避免在测试操作时使用 -a/-o 来进行多条件判断,因为它们将会被废弃,进而导致你的脚本出现问题,所以不建议在test/[中使用-a/-o进行多条件判断。

==

I want to check if [[ $var == foo || $var == bar || $var == more ]] without repeating $var n times.

The portable solution uses case:

In Bash and ksh, Extended globs can also do this within a [[ command:

Alternatively, you may loop over a list of patterns, checking each individually.

For logical conjunction (return true if $var matches all patterns), ksh93 can use the & pattern delimiter.

For shells that support only the ksh88 subset (extglob patterns), you may DeMorganify the logic using the negation sub-pattern operator.

But this is quite unclear and not much shorter than just writing out separate expressions for each pattern.

参考链接:

=EOF=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/2388.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注