bash/sh if statement syntax

7

在各种指南和脚本中,我注意到人们倾向于使用不同的if语句语法。有什么区别和最佳实践呢?我相信以下所有语句,以及许多其他变体,都将返回true:

bar="foo"
if [ "foo" = "foo" ]
if [[ "foo" == $bar ]]
if [ "foo" = "$bar" ]
if [[ "foo" = "$bar" ]]
if [[ "foo" -eq $bar ]]

1
可能是重复的问题:bash:双括号、单括号、圆括号、花括号 - Greg Hewgill
阅读 http://mywiki.wooledge.org/BashGuide http://mywiki.wooledge.org/BashFAQ http://mywiki.wooledge.org/BashPitfalls。 - Philipp
3个回答

5

据我所知

= 期望字符串

-eq 期望整数

"$bar" 用于字面匹配,即 z* 可能会扩展,但 "z*" 将精确匹配通配符字符。

[] 和 [[]] 的区别在于后者不进行单词拆分和路径名扩展,但前者会进行。

此外,[[]] 还允许使用其他运算符:

&& (AND),|| (OR),> (String1 字典序大于 String2),< (String1 字典序小于 String2)

在双方括号测试中,== 比较运算符的行为与单方括号中不同。

[[ $a == z* ]] # 如果 $a 以 "z" 开头,则返回 True(模式匹配)。

[[ $a == "z*" ]] # 如果 $a 等于 z*,则返回 True(字面匹配)。

[ $a == z* ] # 执行文件通配和单词拆分。

[ "$a" == "z*" ] # 如果 $a 等于 z*,则返回 True(字面匹配)。

请查看 http://tldp.org/LDP/abs/html/comparison-ops.html 了解更多信息。


小修正/澄清:===完全相同(即它们都在[[ ]]中进行模式匹配),只是某些实现的[不支持==。基本上,使用==的唯一原因是它在其他语言中很常见。此外,[确实支持字符串比较与<>,你只需要转义它们,否则它们将被解析为I/O重定向:例如[ string1 \< string2 ] - Gordon Davisson

3
[ 是 bash 内置命令,[[ 是 bash 关键字。最佳实践是,如果脚本不必与其他 shell 兼容(例如,如果脚本以 #!/bin/bash 开头),则始终使用 [[,并仅在与 Bourne shell 兼容时使用 [。参见http://mywiki.wooledge.org/BashFAQ/031

2
我推荐使用case/esac。
case "$foo" in
  "bar" ) echo "bar";;
  *) echo "not equal";;
esac

不要担心不同的语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接