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