变量及运算符
变量
变量,即可变化的量,实质是定义一段内存空间,这段空间可以存取任意符合定义的数据类型的数据。
一、bash变量命名:
1、只能包含字母、数字和下划线,并且不能以数字开头
2、不应该跟系统中已有的环境变量重名
3、最好能见名知意
二、bash变量分类:
1、本地变量:只在当前shell进程中有意义
2、环境变量:当前shell进程及子进程中有意义
3、局部变量:某个函数执行过程中有意义
4、位置参数变量:在脚本中引用传递给脚本的参数;
扩展:在shell中,一行命令行中,命令被自动默认为是shell参数$0,其后的命令参数按顺序一次为$1,$2,$3……${10}……
5、特殊变量:具有特殊含义的变量;例如:$?,$*,[email protected],$#,$$
$?:验证上条命令行执行结果,正确执行为0,其他为非0
$*:将所有的位置参数,被作为一个单词
[email protected]:每个参数都被当成一个独立的单词
$#:传递给脚本或函数的参数个数
$$:当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID
三、bash变量类型:
数据类型的定义决定了存储空间的大小,运算范围和存储格式。根据编程语言对变量类型的支持分为强类型和弱类型。
强类型:必须按照数据类型的定义来定义变量
弱类型:变量类型不严格区分
bash编程的变量类型属于弱类型,它的默认数据类型是字符型数据,无需事先声明变量,可直接使用;bash常用的几种数据类型:整数,浮点数,字符型,布尔型等。
举例:120 整数型:需要将120变为二进制数,只占用了8bit 字符型:120每个数字需要一个字符,一个字符用了8bit,3个一共用了24bit
四、bash变量赋值:
格式:[let] var_name=value
声明数据类型使用declare,例如声明整数变量:
declare -i name[=value]
注意:如果先声明了变量为数值型数据,之后给变量赋值为字母或字符串,那么变量的值为0
[[email protected] ~]# set |grep name [[email protected] ~]# name=obama [[email protected] ~]# set|grep name name=obama [[email protected] ~]# [[email protected] ~]# declare -i id [[email protected] ~]# id=2014 [[email protected] ~]# set |grep ^id id=2014 [[email protected] ~]# id=abc [[email protected] ~]# set |grep ^id id=0 [[email protected] ~]#
五、bash变量引用:
引用定义的变量使用符号$,例如:${name},$name
弱引用:"" 其内部的变量引用会被替换为变量值
强引用:‘‘ 其内部的变量引用会保持原有字符
命令引用:`COMMAND`,$(COMMAND),引用的是命令的执行结果
[[email protected] ~]# ll `which cat` -rwxr-xr-x. 1 root root 48568 Oct 15 2014 /bin/cat [ro[email protected] ~]# ll $(which cat) -rwxr-xr-x. 1 root root 48568 Oct 15 2014 /bin/cat [[email protected] ~]# [[email protected] ~]# set |grep name name=obama [[email protected] ~]# echo ‘$name‘ $name [[email protected] ~]# echo "$name" obama [[email protected] ~]#
六、bash变量周期:
从声明创建一个bash变量到这个bash变量被销毁,称为一个变量的生命周期。变量的销毁有两种方式:
1、自动,shell进程终止
2、手动,使用命令unset
七、bash环境变量:
被"导出"的本地变量;将本地变量导出就变成了一个环境变量;也可以直接定义:
export name[=value]
declare -x name[=value]
[[email protected] ~]# name=obama [[email protected] ~]# set|grep name name=obama [[email protected] ~]# env |grep name [[email protected] ~]# export name [[email protected] ~]# env |grep name name=obama [[email protected] ~]# [[email protected] ~]# declare -xi id [[email protected] ~]# id=1025 [[email protected] ~]# set |grep ^id id=1025 [[email protected] ~]# env |grep ^id id=1025 [[email protected] ~]#
八、bash变量查看:
要查看本地普通变量使用命令set,查看环境变量使用:env,printenv,export
九、数组:
定义格式:
1、a=(value1 value2……value#)
2、a[1]=value1
a[2]=value2
……
3、a=(value1 [3]=value3……)
引用格式:
显示单个元素的值: echo ${a[1]}
取出数组中所有的值: echo ${a[@]} 或者echo ${a[*]}
取得数组元素的个数: echo ${#a[@]} 或者 echo ${#a[*]}
[[email protected] ~]# a[1]=1 [[email protected] ~]# a[2]=2 [[email protected] ~]# a[3]=3 [[email protected] ~]# echo ${a[1]} 1 [[email protected] ~]# echo ${a[*]} 1 2 3 [[email protected] ~]# echo ${#a[*]} 3 [[email protected] ~]# b=(2 3 4 5 6) [[email protected] ~]# echo ${b[*]} 2 3 4 5 6 [[email protected] ~]# echo ${#b[*]} 5 [[email protected] ~]# c=(1 [3]=3 [4]=4 5 2) [[email protected] ~]# echo ${c[*]} 1 3 4 5 2 [[email protected] ~]# echo ${c[2]} [[email protected] ~]#
十、扩展
截取字符串变量指定的字符,类似于cut的效果。第一个字符的编号从0开始,与数组的编号相同。
格式:
${变量:位置起点:长度}
[[email protected] ~]# str=abcdefghijk [[email protected] ~]# echo ${str:3} defghijk [[email protected] ~]# echo ${str:4:3} efg [[email protected] ~]#
运算符
啥是运算符和它能干哈,就不用说了吧,小学生都懂的。。直接正题。先看下在bash编程中都有哪些运算符
1、算术运算符:+, -, *, /, %,+=,-=, *=, /=, %=,++,--
2、整数比较符:-gt,-lt,-ge,-le,-eq,-ne
3、字符比较符:==, >, <, !=, -z, -n, =~
4、条件组合符:-a,-o,!,&&,||
5、文件判断符:-e,-a,-f,-d,-h,-L,-b,-c,-S,-p,-r,-w,-x,-u,-g,-k,-O,-G,-nt,-ot,-ef
不敢说上面是所有的,但是日常使用到的,上面罗列的已经是绝对够了。详细看下每个的使用吧。
1、算术运算符
这个真不知道怎么解释,小学生都会的。+ - * / 加减乘除 % 求余
运算后赋值
+=:加后赋值
-=:减后赋值
*=:乘后赋值
/=:除后赋值
%=:求余赋值
[[email protected] ~]# declare -i i=2 [[email protected]ntos ~]# declare -i j=3 [[email protected] ~]# let i+=$j [[email protected] ~]# echo $i 5 [[email protected] ~]# let i-=1 [[email protected] ~]# echo $i 4 [[email protected] ~]# let i*=3 [[email protected] ~]# echo $i $j 12 3 [[email protected] ~]# let i/=$j [[email protected] ~]# echo $i $j 4 3 [[email protected] ~]# let i%=$j [[email protected] ~]# echo $i $j 1 3 [[email protected] ~]
++,--这两个学过编程的都明白啥意思。是吧,下面是这个符号的推算过程:
let count=$[$count+1] --> let count+=1 --> let count++ let count=$[$count-1] --> let count-=1 --> let count--
2、整数比较符
-gt $A -gt $B:是否大于;是则为“真”,否则为“假”;
-ge $A -ge $B: 是否大于等于;
-lt $A -lt $B:是否小于;
-le $A -le $B: 是否小于等于;
-eq $A -eq $B: 是否等于;
-ne $A -ne $B:是否不等于;
[[email protected] bash]# test $i>$j [[email protected] bash]# echo $? 0 [[email protected] bash]# test $i<$j [[email protected] bash]# echo $? 0 [[email protected] bash]# test $i -gt $j [[email protected] bash]# echo $? 1 [[email protected] bash]# test $i -lt $j [[email protected] bash]# echo $? 0 [[email protected] bash]# echo $i $j 1 5 [[email protected] bash]#
3、字符比较符
> "$A" > "$B":是否大于;
< "$A" < "$B":是否小于;
== "$A" == "$B":是否等于;
!= "$A" != "$B":是否不等于;
-z -z "$A":是否为空;空则为“真”,否则为“假”
-n -n "$A":是否不空;不空则“真”,空则为“假”
=~ $A =~ PATTERN:字符或字串是否匹配模式PATTERN
注意:应该使用[[ EXPRESSION ]],ASCII数值越大,字符比较时其值越大;
[[email protected] bash]# cat fuzhi.sh #!/bin/bash if [[ $1 > $2 ]];then echo $1 elif [[ $1 < $2 ]];then echo $2 fi [[email protected] bash]# [[email protected] bash]# ./fuzhi.sh abc cba cba [[email protected] bash]# ./fuzhi.sh cab acb cab [[email protected] bash]# ./fuzhi.sh abc abc [[email protected] bash]# ./fuzhi.sh abc acb acb [[email protected] bash]#
4、条件组合符
条件组合符,即将多个条件表达式组合起来作为一个整体的符号。关系为与,或,非三种。符号:
与:-a,&&
或:-o,||
非:!
与运算: 0 -a 0 = 0
0 -a 1 = 1
1 -a 0 = 1
1 -a 1 = 1
或运算: 0 -o 0 = 0
1 -o 0 = 0
0 -o 1 = 0
1 -o 1 = 1
非运算:取反,0变1,1变0
[[email protected] bash]# cat fuzhi.sh #!/bin/bash if [ $1 -gt $2 ]&&[ $2 -gt $3 ];then echo $1 elif [ $1 -lt $2 ]||[ $2 -gt $3 ];then echo $2 elif ! [ $1 -eq $3 ];then echo $3 fi [[email protected] bash]# ./fuzhi.sh 3 2 1 3 [[email protected] bash]# ./fuzhi.sh 1 2 3 2 [[email protected] bash]# ./fuzhi.sh 2 1 3 3 [[email protected] bash]#
5、文件判断符:测试文件的存在性以及属性
-e $file: 是否存在;存在则为“真”,否则为“假”;
-a $file: 同上;
-f $file:文件是否存在且为普通文件;
-d $file:文件是否存在且为目录;
-h $file:是否存在且为符号链接文件;
-L $file: 同上
-b $file:是否存在且为块设备文件;
-c $file:是否存在且为字符设备文件;
-S $file:是否存在且为套接字文件;
-p $file: 是否存在且为管道文件;
权限判断:
-r $file: 当前用户对文件是否拥有读权限;
-w $file:当前用户对文件是否拥有写权限;
-x $file:当前用户对文件是否拥有执行权限;
-u $file:文件是否拥有SUID权限;
-g $file:文件是否拥有SGID权限;
-k $file:文件是否拥有sticky权限;
属主/组判断:
-O $file: 当前用户是否为指定文件的属主;
-G $file: 当前用户是否为指定文件的属组;
双目操作符:
$file1 -nt $file2: file1是否新于file2, file1的最近一次的修改时间戳是否晚于file2的;
$file1 -ot $file2: file1是否旧于file2, file1的最近一次的修改时间戳是否早于file2的;
$file1 -ef $file2:file1与file2是否指向了同一个inode;测试二者是否为同一个文件的硬链接;