(){}(())[][[]]

本文最后更新于:2023年12月5日 晚上

单小括号 ()

():等同`` ,命令组。括号中的命令将会新开一个子 shell 顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。

可以使用$获取()中的标准输出,$()

array=(a b c d) 用于初始化数组

{}

{}和()一样可以将多个命令组合在一起,使用分号隔开,批量执行,区别在于:
1.()是新开进程,{}在当前进程
2.()和命令之间不需要空格,{}左边和命令之间必须要有空格
3.()中最后一个命令可以不加分号,{}中所有命令都要加分号 4.$搭配()可以获取()的返回值;$搭配{}是用来解析变量,这点和 php 一样

扩展

bash 支持{a,b,c}这样的扩展,比如 a{d,c,b}e 会被扩展成 ade ace abe

类似还有:cp filename{,bak}

等同于 :cp filename filename.bak

简化重复字符串

{} 可以实现打印重复字符串的简化形式

[root@4710419222 test]# touch {0..9}.log
[root@4710419222 test]# ls
0.log  1.log  2.log  3.log  4.log  5.log  6.log  7.log  8.log  9.log
[root@4710419222 test]# ls {4..7}.log
4.log  5.log  6.log  7.log
[root@4710419222 test]# ls {0..9..2}*
0.log  2.log  4.log  6.log  8.log
[root@4710419222 test]# ls {1,4,6}.log
1.log  4.log  6.log
# 关闭和开启{}的扩展功能
[root@4710419222 test]# echo $-
himBH
[root@4710419222 test]# set +B
[root@4710419222 test]# echo $-
himH
[root@4710419222 test]# ls {1,4,6}.log
ls: cannot access {1,4,6}.log: No such file or directory
[root@4710419222 test]# set -B
[root@4710419222 test]# ls {1,4,6}.log
1.log  4.log  6.log

补充:批量创建文件是用{},批量显示文件使用[]

变量替换

变量测试

双小括号 (())

将数学运算表达式放在(())中,表达式可以有一个,也可以由多个,多个表达式用逗号分割,(())的执行结果取决于最后一个表达式的值

可以使用$获取(())命令的执行结果

单中括号 []

[]有两种用法:一是等同 test; 二是算数运算$[],等同于$(())
关于 test 和[],推荐使用[]; 关于$[]和$(()),推荐使用$(())

1. 等同 test

等同于 test 命令,通常和 if 语句一起使用,在”[]”的内部和数据之间必须使用空格;否则判断式会报错。

test 和[]中可用的比较运算符只有==和!=,两者都是用来比较字符串的,不可用于整数比较,整数比较只能使用-eq、-gt 这种形式。

具体参数参考test.md

双中括号 [[]]

[[]]是shell内置关键字,它和test类似,也用来检测某个条件是否成立。
test能做到的,[[]]也能做到,而且做的更好,test 做不到的,[[]]还能做到。可以认为[[]]是 test 的升级版,对细节进行了优化,并扩展了一些功能。

[[]]的用法

[[ expression ]]

当[[]]判断expression成立时,退出状态0,否则为非0值,注意[[]]和 expression 之间的空格,这两个空格是必须的,否则会导致语法错误。

[[]]不需要注意某些细枝末节

[[]]是shell内置关键字,不是命令,在使用时没有给函数传递参数的过程,所以test命令的某些注意事项在[[]]中不存在了,具体包括:

  • 不需要把变量名用””包裹起来,即使变量是空值,也不会出错
  • 不需要、也不能对>、<进行转义,转义后会出错

[[]]支持逻辑运算符

[[]]剔除了 test 命令的-o 和-a 选项,只能使用||和&&

[[]]支持正则表达式

在[[]]中,可以使用=~来检测字符串是否符合某个正则表达式,他的用法为:

[[ str =~ regex ]]

总结

[[]]完全可以替换[],但是[[]]对数字的比较仍然不友好,所有,当 if 判断条件时,用(())来处理整型数字,当使用正则表达式或通配符使用[[]],其它情况一般使用 [ ]


(){}(())[][[]]
http://blog.lujinkai.cn/运维/基础/shell脚本编程/(){}(())[][[]]/
作者
像方便面一样的男子
发布于
2020年12月9日
更新于
2023年12月5日
许可协议