程序的主要部件:
1
2
3
|
1、变量
2、条件测试
3、语句:如:
if
、
for
、
while
、
case
|
一、变量
变量是任何一门语言中的一个重要组成部分。定义变量就是在内存空间中开辟空间,使用该空间来存储程序运行中的中间数据的。
既然是存储数据的空间了,那么开辟的内存空间应该有二个特点:
1、在内存中开辟的空间的大小。
声明变量的类型,其实就决定了在内存中开辟的空间的大小了。
如:int var
这就决定了变量var,能够存储的数据长度为65535.在强类型的语言中,使用变量时必需要声明变量的类型,再使用。该变量只能存储指定的类型的数据。
如果该变量存储的数据大于开辟的内存空间的话,就会溢出。也就是造成数据的丢失。这是在定义变量的时候要注意的。
Bashshell是弱类型的语言,使用变量存储程序执行的中间数据不需要事先声明就可以直接使用了。默认变量是字符类型的。
如:
引用命令的执行结果,给变量:freeMem赋值。
1
|
[root@stu13 ~]
# freeMem=$(free -m | awk '/^Mem/{print ($4+$6+$7)/$2}')
|
查看变量freeMem的值
1
2
|
[root@stu13 ~]
# echo $freeMem
0.883534
|
输出变量freeMem加1的结果。
1
2
|
[root@stu13 ~]
# echo "${freeMem} + 1"
0.883534 + 1
|
说明:
从结果中,可以看出只是做字符的连接。所以,Bashshell的变量默认是字符类型的。
2、在内存中开辟的空间的存活时长。
这就是所谓:“程序中变星的作用范围”。
1
2
3
4
5
|
全局变量(环境变量) 使用【
export
】导出,任何shell都要以访问。
本地变量 只对当前shell进程有效;对其它shell进程无效,
包括当前shell进程的子进程。
局部变量 对shell脚本中某代码片断有效;使用【
local
】说明该变量变局部变量。
通常用于本地变量。
|
我们知道了,变量的作用范围之后,在程序的啥位置可以引用到该变量的值。当我们要使用到变量存储程序的执行的中间数据的时候:
如果需要在程序的不同位置(主程序中、函数中)引用变量的话,就要把变量定义为本地变量。如果,把该变量定义成局部变量的话,存储的数据就会丢失了。
如果我们在函数中使用到变量,且只在该函数体中引用该变量的话,就不必要把变量定义成本地变量了,应该把它变量设置为:局部变量。只在函数体中有效。当主程序调用该函数完成之后,该变量所占用的内存空间就被释放了。不竞内存是有限的。这也是程序优劣的一个体现。
1
2
3
|
testVar() {
local
pid base= user=
nice
=
bg
= pid_file=
}
|
既然,bashshell的变量默认是字符类型的。那么怎么对变量做运行算术运算呢?
做算术运算的条件:必需是数值型。
所以,在做算术运算之前要做变量类型的转换。
例:
1
2
|
[root@stu13 ~]
# a=2
[root@stu13 ~]
# b=3
|
做字符的连接
1
2
|
[root@stu13 ~]
# echo "$a$b"
23
|
使用$[],告诉bashshell要对变量:$a、$b 做算术运算。bashshell在做算术运算之前就对这两个变量的类型做隐式转换,之后才做算术运算的。
1
2
|
[root@stu13 ~]
# echo "$[$a + $b]"
5
|
说明:
对字符类型的变量:$a、$b做算术运算,要先进做数据类型转换再做算术运算的。如果,我们明确知道这两个变量记录的数据是用来做算术运算的话,在使用变量之前最好声明变量的类型,这避免了做数据类型转换的过程。我们的程序执行是不是快一点呀?
还有一个好处,是节约内存空间:
1
2
|
把123当做数值类型存储的话:一个字节8位就可以存储数值型 123
把123当做字符存储存储的话:要三个字节才可以存储字符型 123
|
所以,我们如果明确知道变量的存储类型的话,最好声明该变量是用来存储什么类型的数据的。
如:
1
2
3
4
5
6
|
[root@stu13 ~]
# declare -i sum=0
[root@stu13 ~]
# let sum+=4
[root@stu13 ~]
# declare -p sum
declare
-i
sum
=
"4"
[root@stu13 ~]
# echo $sum
4
|
三、bashshell的条件测试。
程序中有了判断语句(if)、循环语句(for,until,while)、选择语句(case),这些语句都可以互相嵌套使用,这就使得程序的逻辑功能非强强大,能模拟很多人的行为,这就是自动化的实现。
但是它们的最核心是就是探测某一事物的“真/假”执行不同的行为(也就是这些做条件测试)。那么,在 bashshell中:0 表示:真。非0,表示假。这与其它编程语言是相背的。
用到if、for、until、while,的前提是要先了解:如何做条件测试。:
1、字符串的比较、匹配、判断:
(1)、字符串的判断
1
2
|
-n string 字符串不为空得为真
-z string 字符串为空则为真
|
(2)、字符串的比较
比较在ACIL码表当中,谁靠前谁靠后。
1
2
3
|
string1 == string2 比较两字符串是否相同
string1 > string2 比较字符串string1是否在string2的前面。
string1 < string2
|
(3) 字符串的匹配
1
|
string =~ PATTERN
|
2、数值的比较
整数比较测试:
1
2
3
4
5
6
|
-gt -----> 大于 Greater Than
-
ge
-----> 大于等于 Greater or Equal
-lt -----> 小于 Lesser Than
-
le
-----> 小于等于 Lesser or Equal
-
eq
-----> 等于 equal
-
ne
-----> 不等于 Not Equal
|
3、文件的判断.
Linux有一个很重要的哲学思想:一切皆文件,所以bashshell也提供了很丰富的文件测试功能
1
2
3
4
5
6
7
8
9
10
11
|
-e FILE 测试一个目录文件是否存在。 exists
-f FILE 测试一个文件是否是普通文件
-d FILE 测试一个文件是否为目录
-h
/-l
FILE 测试一个文件是否为符号连接
-r FILE 测试当前用户是否对该文件有读权限
-w FILE 测试当前用户是否有写权限
-x FILE 测试当前用户是否有执行权限
-s FILE 测试一个文件是否是套接字文件且存在才返回真(0)
-b FILE 测试一个文件是否是块设备文件且存在才返回真
-c FILE 存在并且字符设备则返回真
|
4、命令的执行状况(成功与否)
1
2
|
# COMMAND
# echo $? -------> 如果:$?为:0 的话。就代表上面的命令执行成功的。否则是执行失败的。
|
脚本是做条件测试使用的符号与命令:
条件测试的结果通常是布尔型的:真或假
1
2
3
|
1、
test
expression(表达式) 测试表达式是真不是假
2、[ expression ] 注意:expression两边要有空格
3、[[ expression ]]
|
注意单双中括号是有区别的:
一个中括号类型于bash shell 的内置命令
两个中括号是bash shell的关键字。可以使用类型正则表达式来测试
如:
1
2
3
4
5
6
7
8
|
[root@stu13 ~]
# read -p "Plz enter varValue: " var
Plz enter varValue:
yes
[root@stu13 ~]
# [[ "$var" =~ [Yy][Ee][Ss] ]] && echo "ok"
ok
[root@stu13 ~]
# read -p "Plz enter varValue: " var
Plz enter varValue: Yes
[root@stu13 ~]
# [[ "$var" =~ [Yy][Ee][Ss] ]] && echo "ok"
ok
|
4、组合条件测试
组合条件测试:在多个条件间实现逻辑运算
1
2
3
4
|
(1)、与: [ conditionl -a condition2 ] 两个为真才为真
或使用 condition1 && condition2
(2)、或: [ conditionl -o condition2 ] 只要一个为真则为真
condition1 || condition2
|
三、构造逻辑强大的程序
知道了bash shell 的条件测试,就可以使用:if、for、until、while、case 等语句互相嵌套,根据条件测试的真假和使用变量记录程序运行过程中的数据,来构造逻辑性很强的程序了。
当然,我们要学会这些语句的使用。
1、if语句有三种格式:--------> 做”判断“
(1)、单分支 if 语句
1
2
3
|
if
测试条件;
then
选择分支
if
|
注意:分号(;)是语句结束符。因为 then 是另一个语句。与 if 写在一行。所以要使用分号。
(2)、双分支的 if 语句.(两个分支仅执行其中之一)
1
2
3
4
5
|
if
测试条件;
then
选择分支
else
选择分支
if
|
(3)、多分支
1
2
3
4
5
6
7
8
|
if
条件1;
then
分支1
elif
条件2;
then
分支2
...
else
分支n
fi
|
2、for语句的格式
1
2
3
|
for
VAR_NAME
in
LIST;
do
循环体
done
|
3、while适用于循环次数未知,或不便用for直接生成较大的列表时;
1
2
3
|
while
测试条件;
do
循环体
done
|
4、case ---------------> “做选择”
1
2
3
4
5
6
7
8
9
10
11
12
|
case
变量引用
in
PATTERN1) --------> 可以做字符比较或模式匹配
选择分支1
;;
PATTERN2)
选择分支2
;;
...
*)
选择分支n
;;
esac
|