LinuxShell的 中括号[], 双中括号[[]], 双小括号(())
-
中括号[], 双中括号[[]], 双小括号(()) 都可用于条件判断
-
双中括号
[[]]
, 算是 中括号[]
的增强
双中括号[[]]
的[[
是bash的关键字, 并不是命令[remotet@vb-f39 /]$ type [[ [[ 是 shell 关键字
-
单双中括号
[]
和[[]]
既可以用于字符串比较, 也可以用于整数比较
单双等号=
和==
用于字符串比较,-eq
用于整数比较 -
双小括号
(())
只能用于整数比较, 不能用于字符串比较
用=
赋值, 用==
比较
单等号=
和双等号==
和 -eq
中括判字符, 小括判数字
- 在 中括号
[]
双中括号[[]]
中, 单等号=
和双等号==
效果相同, 用于字符串判断
if [ "a" = "a" ];
if [ "a" == "a" ];
if [ "$VarName1" = "$VarName2" ];
if [ "$VarName1" == "$VarName2" ];
- 在双小括号
(())
中, 单等号=
用于赋值 双等号==
用于数值大小判断
if (( a==3 ));
if (( $a==3 ));
for((i=0;i<10;i++));
- 中括号要有空格,双小括号可以没有, 中括号要
$
,小括号可有可无$
if [ "$v" = "hello" ];
if [ "$v" == "hello" ];
if((v==6));
if(($v==6));
- 中括号双中括号可以用
-eq
进行整数大小判断, 双小括号不能用-eq
if [ "$v" -eq 6 ];
if [[ "$v" -eq 6 ]];
if((v==6));
if(($v==6));
test, 可粘贴到控制台测试
v="hello"
if [ "$v" = "hello" ]; then echo yes; else echo no; fi
if [ "$v" == "hello" ]; then echo yes; else echo no; fi
if [[ "$v" = "hello" ]]; then echo yes; else echo no; fi
if [[ "$v" == "hello" ]]; then echo yes; else echo no; fi
if [ "$v" -eq 6 ]; then echo yes; else echo no; fi
if [[ "$v" -eq 6 ]]; then echo yes; else echo no; fi
if((v==6)); then echo yes; else echo no; fi
if(($v==6)); then echo yes; else echo no; fi
echo "----------------------------------------------------------------"
v=6
if [ "$v" = "hello" ]; then echo yes; else echo no; fi
if [ "$v" == "hello" ]; then echo yes; else echo no; fi
if [[ "$v" = "hello" ]]; then echo yes; else echo no; fi
if [[ "$v" == "hello" ]]; then echo yes; else echo no; fi
if [ "$v" -eq 6 ]; then echo yes; else echo no; fi
if [[ "$v" -eq 6 ]]; then echo yes; else echo no; fi
if((v==6)); then echo yes; else echo no; fi
if(($v==6)); then echo yes; else echo no; fi
测试效果
[z@vb-f39 txt]$ v="hello"
if [ "$v" = "hello" ]; then echo yes; else echo no; fi
if [ "$v" == "hello" ]; then echo yes; else echo no; fi
if [[ "$v" = "hello" ]]; then echo yes; else echo no; fi
if [[ "$v" == "hello" ]]; then echo yes; else echo no; fi
if [ "$v" -eq 6 ]; then echo yes; else echo no; fi
if [[ "$v" -eq 6 ]]; then echo yes; else echo no; fi
if((v==6)); then echo yes; else echo no; fi
if(($v==6)); then echo yes; else echo no; fi
echo "----------------------------------------------------------------"
v=6
if [ "$v" = "hello" ]; then echo yes; else echo no; fi
if [ "$v" == "hello" ]; then echo yes; else echo no; fi
if [[ "$v" = "hello" ]]; then echo yes; else echo no; fi
if [[ "$v" == "hello" ]]; then echo yes; else echo no; fi
if [ "$v" -eq 6 ]; then echo yes; else echo no; fi
if [[ "$v" -eq 6 ]]; then echo yes; else echo no; fi
if((v==6)); then echo yes; else echo no; fi
if(($v==6)); then echo yes; else echo no; fi
yes
yes
yes
yes
bash: [: hello: 需要整数表达式
no
no
no
no
----------------------------------------------------------------
no
no
no
no
yes
yes
yes
yes
对比中括号[]和双中括号[[]]
在Shell中,方括号([]
)和双层方括号([[ ]]
)都用于条件测试。它们的功能相似,但双层方括号提供了更多的功能和灵活性。
-
单层方括号(
[]
):- 用于条件测试,例如判断文件是否存在、判断字符串是否等于某个值等。
- 不支持正则表达式匹配,只能进行简单的字符串匹配。
- 不支持逻辑操作符,如
-a
(与)、-o
(或)和!
(非)。
-
双层方括号(
[[ ]]
):- 与单层方括号类似,用于条件测试。
- 支持正则表达式匹配,可以使用
=~
操作符进行匹配。 - 支持逻辑操作符,如
-a
(与)、-o
(或)和!
(非)。 - 提供更好的错误处理和防止字符串拆分和文件名扩展的特性。
下面是一些示例,展示了单层方括号和双层方括号的用法:
使用单层方括号:
if [ -f "file.txt" ]; then
echo "File exists."
fi
if [ "hello" == "world" ]; then
echo "Strings are equal."
fi
使用双层方括号:
if [[ -f "file.txt" ]]; then
echo "File exists."
fi
if [[ "hello" == "world" ]]; then
echo "Strings are equal."
fi
可以看到,双层方括号提供了更多的功能和灵活性,因此在编写复杂的条件语句时,建议使用双层方括号。