近来学到了shell脚本编程,认为脚本中的不同括弧有不同的好处,以及有些括弧的格式也有特殊要求,下边我就总结一下各类括弧的用法。
一、小括弧();双小括弧(())
1、单小括弧()
1:命令替换。等同于`comm`centos shell脚本编程linux操作系统,shell扫描一遍命令行,发觉了$(comm)结构,便将$(comm)中的comm执行一次,得到其标准输出,再将此输出放在原先命令。
# ls
a b c
# echo $(ls)
a b c
#echo `ls`
a b c
2:用于初始化字段。如:array=(abcd)
[root@localhost ~]# array=(a b c d)
[root@localhost ~]# declare -a
declare -a array='([0]="a" [1]="b" [2]="c" [3]="d")'
2、双小括弧(())
((表达式))常用于算术运算比较,双括弧中的变量可以不使用$符号前缀。括弧内支持多个表达式用冒号分开。只要括弧中的表达式符合C语言运算规则,例如可以直接使用for((i=0;i
#求100以内的偶数
#! /bin/bash
num=2
while ((num<100)) #数值与运算符可以没有空格,变量的使用时也可以不使用$num
do
echo "$num"
((num=num*2))
done
二、中括弧[];双中括弧[[]]
1:单中括弧[]
1:算术比较,例如一个变量是否为0,[$var-eq0]。
[ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a
[ $var1 -ne 0 -o $var2 -gt 2 ] # 使用逻辑或 -o
对变量或值进行算术条件判定:
[ $var -eq 0 ] # 当 $var 等于 0 时,返回真
[ $var -ne 0 ] # 当 $var 不等于 0 时,返回真
须要注意的是[与]与操作数之间一定要有一个空格,否则会报错。例如下边这样都会报错:
[$var -eq 0 ] 或 [ $var -ne 0]
其他比较操作符:
操作符意义
-gt
小于
-lt
大于
-ge
小于或等于
-le
大于或等于
可以通过-a(and)或-o(or)结合多个条件进行测试:
[ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a
[ $var1 -ne 0 -o $var2 -gt 2 ] # 使用逻辑或 -o
2:文件属性测试,例如一个文件是否存在,[-e$var],是否是目录linux服务器配置与管理,[-d$var]。
文件系统属性测试
使用不同的条件标志测试不同的文件系统属性。
操作符意义
[-f$file_var]
变量$file_var是一个正常的文件路径或文件名(file),则返回真
[-x$var]
变量$var包含的文件可执行(execute),则返回真
[-d$var]
变量$var包含的文件是目录(directory),则返回真
[-e$var]
变量$var包含的文件存在(exist),则返回真
[-c$var]
变量$var包含的文件是一个字符设备文件的路径(character),则返回真
[-b$var]
变量$var包含的文件是一个块设备文件的路径(block),则返回真
[-w$var]
变量$var包含的文件可写(write),则返回真
[-r$var]
变量$var包含的文件可读(read),则返回真
[-L$var]
变量$var包含是一个符号链接(link),则返回真
使用方式如下:
fpath="/etc/passwd"
if [ -e $fpath ]; then
echo File exits;
else
echo Does not exit;
fi
3:字符范围。用作正则表达式的一部份,描述一个匹配的字符范围。作为test用途的中括弧内不能使用正则。
[root@localhost ~]# echo 1234abcdef |tr -cd "[0-9]"
1234[root@localhost ~]# cat 1.txt|grep "[0-9]"
123
135
1244
156
222
178
189999
12gg
[root@localhost ~]#
4:在一个array结构的上下文中,中括弧拿来引用字段中每位元素的编号
[root@localhost ~]# echo ${name[2]}
durank
[root@localhost ~]#
2:双中括弧[[]]
[[]]多拿来进行字符串比较,例如两个字符串是否相同,[[$var1==$var2]]
注意=前后有一个空格centos shell脚本编程,假如忘掉加空格,就弄成了形参句子,而非比较关系了。
字符串的其他比较情况:
操作符意义
[[$str1!=$str2]]
假如str1与str2不相同,则返回真
[[-z$str1]]
假如str1是空字符串,则返回真
[[-n$str1]]
假如str1是非空字符串,则返回真
使用逻辑运算符&&和||可以轻松地将多个条件组合上去,例如:
str1="Not empty"
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
echo str1 is nonempty and str2 is empty string.
fi
test命令也可以从来执行条件检查,用test可以防止使用过多的括弧,[]中的测试条件同样可以通过test来完成。
if [ $var -eq 0 ]; then echo "True"; fi
等价于
if test $var -eq 0; then echo "True"; fi
三:大括弧{}
常规用法
1:大括弧拓展。在大括弧中,不容许有空白,除非这个空白被引用或通配符。
第一种:对大括弧中的以冒号分割的文件列表进行拓展。
第二种:对大括弧中以点点(..)分割的次序文件列表起拓展作用,
# ls {ex1,ex2}.sh
ex1.sh ex2.sh
# ls {ex{1..3},ex4}.sh
ex1.sh ex2.sh ex3.sh ex4.sh
# ls {ex[1-3],ex4}.sh
ex1.sh ex2.sh ex3.sh ex4.sh
2:字符串提取和替换
${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
第一种模式:${var:num},这些模式时,shell在var中提取第num个字符到末尾的所有字符。若num为负数,从右侧0处开始;若num为正数,从右侧开始提取字串,但必须使用在引号前面加空格或一个数字或整个num加上括弧,如${var:-2}、${var:1-3}或${var:(-2)}。
第二种模式:${var:num1:num2},num1是位置,num2是厚度。表示从$var字符串的第$num1个位置开始提取宽度为$num2的子串。不能为正数。
第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。
第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。
[root@centos ~]# var=/home/centos
[root@centos ~]# echo $var
/home/centos
[root@centos ~]# echo ${var:5}
/centos
[root@centos ~]# echo ${var: -6}
centos
[root@centos ~]# echo ${var:(-6)}
centos
[root@centos ~]# echo ${var:1:4}
home
[root@centos ~]# echo ${var/o/h}
/hhme/centos
[root@centos ~]# echo ${var//o/h}
/hhme/cenths
字符大小写转换
${var^^}:把var中的所有大写字母转换为小写
${var,,}:把var中的所有小写字母转换为