在各种指南和脚本中,我注意到人们倾向于使用不同的if语句语法。有什么区别和最佳实践呢?我相信以下所有语句,以及许多其他变体,都将返回true:
bar="foo"
if [ "foo" = "foo" ]
if [[ "foo" == $bar ]]
if [ "foo" = "$bar" ]
if [[ "foo" = "$bar" ]]
if [[ "foo" -eq $bar ]]
在各种指南和脚本中,我注意到人们倾向于使用不同的if语句语法。有什么区别和最佳实践呢?我相信以下所有语句,以及许多其他变体,都将返回true:
bar="foo"
if [ "foo" = "foo" ]
if [[ "foo" == $bar ]]
if [ "foo" = "$bar" ]
if [[ "foo" = "$bar" ]]
if [[ "foo" -eq $bar ]]
据我所知
= 期望字符串
-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[
是 bash 内置命令,[[
是 bash 关键字。最佳实践是,如果脚本不必与其他 shell 兼容(例如,如果脚本以 #!/bin/bash
开头),则始终使用 [[
,并仅在与 Bourne shell 兼容时使用 [
。参见http://mywiki.wooledge.org/BashFAQ/031。case "$foo" in
"bar" ) echo "bar";;
*) echo "not equal";;
esac