$(()) 或者let进行整数运算
说明:$(())表达式内不需要使用空格(加上也无所谓)。let命令是bash内建命令,其参数要经过单词扩展,因此最好给let的表达式加上引号。
[root@web1 ~]# echo $((3+5))
8
[root@web1 ~]# sum=200
[root@web1 ~]# echo $((3+5*sum))
1003
[root@web1 ~]# let sum=3**5
[root@web1 ~]# echo $sum
243
复合命令
if (( $# < 3 ))
说明:双括号是复合命令的一种。这是一种比较新的bash改进,专门用于有if语句的场合。它会对其中的算术表达式求值。
双括号与方括号的区别:可用于if语句的这两种语法之间的重要区别在于测试的表达方式及其能够测试的对象种类。双括号仅限于算术表达式。方括号还可以测试文件特性。但是方括号的算术测试语法远不如双括号方便,尤其是用括号将表达式分成若干子表达式时(在方括号中,需要给括号加上引号或将其转义。)
例:[ ( 3 -gt 2 ) -o ( 4 -lt 1 ) ]
模式匹配
if [[ "${MYFILENAME}" == *.jpg ]]
在if语句中使用符合命令[[]]可以在等量运算符的右侧启用shell风格的模式匹配。
[[ ]] 语法不同于test命令的老形式[,它是一种较新的bash机制。能够在[]中使用的运算符也可以在[[]]中使用,但在后者中,等号是一种更为强大的字符串比较运算符。在这里面,=和==两者在语义上是相同的,但推荐使用==,这样更加醒目。
标准模式匹配
包括*(匹配任意数量的字符)、?(匹配单个字符)以及[](匹配字符列表中的任意一个)。注意,其写法与shell文件通配符类似,但不同于正则表达式。
如果进行模式匹配,就不能把模式放入引号中,否则就只能匹配到以星号为首的字符串(模式匹配按照模式字符串的字面意义意义进行匹配)。
扩展模式匹配
通过启用某些bash选项,可以使用一些更为强大的模式匹配功能。
shopt -s extglog #打开shell选项。
extglob选项设计扩展模式匹配(或通配符匹配)。借助扩展模式匹配,我们可以使用多个模式,彼此间用|字符分割并通过括号分组。括号之前的@字符表示仅匹配括号中的模式一次。
例,查找以.jpg或者.jpeg结尾的文件名
shopt -s extglog
if [[ "FN" == *.@(jpg|jpeg) ]]
then
……
扩展模式 | 含义 |
---|---|
@( ... ) | 仅匹配一次 |
*( ... ) | 匹配0次或多次 |
+( ... ) | 匹配1次或多次 |
?( ... ) | 匹配0次或1次 |
!( ... ) | 匹配除此之外的任何模式 |
正则表达式匹配
完整的脚本
#!/usr/bin/env bash
# cookbook filename: trackmatch
#
for CDTRACK in *
do
if [[ "$CDTRACK" =~ "([[:alpha:][:blank:]]*)- ([[:digit:]]*) - (.*)$" ]]
then
echo Track ${BASH_REMATCH[2]} is ${BASH_REMATCH[3]}
mv "$CDTRACK" "Track${BASH_REMATCH[2]}"
fi
done
if [[ "$CDTRACK" =~ "([[:alpha:][:blank:]]*)- ([[:digit:]]*) - (.*)$" ]]
说明:关于数组BASH_REMATCH,它是bash内建的数组变量。$BASH_REMATCH的各个元素由括号中的每个子表达式产生。第0个元素(${BASH_REMATCH[0]})是正则表达式所匹配的整个字符串。子表达式可以通过${BASH_REMATCH[1]},${BASH_REMATCH[2]}等形式引用。
只要将正则表达式写成这样,就会生成变量$BASH_REMATCH。
[:alpha:]*:这是第一个表达式,采用了POSIX字符组的[:alpha:]和[:blank:]代表任意的字母和空白字符,随后的星号表示0次或多次重复。
[[:digit:]]*:这是第二个子表达式,[:digit:]代表数位,加上星号表示方括号中的数位出现0次或多次。
(.*)$:匹配任意字符出现任意次数。$匹配结尾。
评论