补基础之shell和Makefile

shell介绍

1、shell是操作系统的终端命令行
(1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式。
(2)我们可以使用shell和操作系统、uboot等软件系统进行交互。具体来说就是我们通过shell给软件系统输入命令然后回车执行,执行完成后又会回到shell命令行可以再次输入命令执行。
(3)上述的操作方式一般情况下工作很好,但是有缺陷。譬如我们要在linux下创建一个文件a.c,可以touch a.c 但是如果我现在是用在linux下创建100个文件,分别为a1.c  a2.c…..a100.c 如果这时候还是手工去命令行下执行命令创建也可以,但是很累。最好的做法就是把创建过程写成一个shell脚本程序,然后去执行这个shell脚本程序,执行这个程序的效果和手工在命令行输入那些命令效果一样的。(回忆在arm裸机中安装交叉编译工具链时,创建arm-linux-xxx的符 链接时)

2、shell是一类编程语言
(1)编写shell脚本时使用的语言就是shell语言,又叫脚本语言。
(2)shell脚本其实是一类语言而不是一个语言。

3、常用shell语言:sh、bash、csh、ksh、perl、python等
(1)在linux下常用的脚本语言其实就是bash、sh;
(2)perl、python这样的高级shell脚本语言,常用在 络管理配置等领域,系统运维人员一般要学习这些。
(3)脚本语言一般在嵌入式中应用,主要是用来做配置。(一个复杂的嵌入式程序都是可配置的,配置过程就是用脚本语言来实现的)自然不会使用过于复杂的脚本语言特性,因此只需要针对性的学习即可。
(4)linux下最常用的脚本就是bash,我们学习也是以bash为主。

4、shell脚本的运行机制:解释运行
(1)C语言(C++)这种编写过程是:编写出源代码(源代码是不能直接运行的)然后编译链接形成可执行二进制程序,然后才能运行;而脚本程序不同,脚本程序编写好后源代码即可直接运行(没有编译链接过程)
(2)shell程序是解释运行的,所谓解释运行就是说当我们执行一个shell程序时,shell解析器会逐行的解释shell程序代码,然后一行一行的去运行。(顺序结构)
(3)CPU实际只认识二进制代码,根本不认识源代码。脚本程序源代码其实也不是二进制代码,CPU也不认识,也不能直接执行。只不过脚本程序的编译链接过程不是以脚本程序源代码为单位进行的,而是在脚本运行过程中逐行的解释执行时才去完成脚本程序源代码转成二进制的过程(不一定是编译链接,因为这行脚本程序可能早就编译连接好了,这里我们只是调用它)的。

动手写第一个shell

2、hello world程序和解释
(1)shell程序的第一行一般都是: #!/bin/sh 这行话以#!开始,后面加上一个pathname,这行话的意思就是指定shell程序执行时被哪个解释器解释执行。所以我们这里写上/bin/sh意思就是这个shell将来被当前机器中/bin目录下的sh可执行程序执行。
可以将第一行写为:#!/bin/bash来指定使用bash执行该脚本。
注意:在ubuntu上面默认使用的解释器sh其实不是bash,而是dash。dash是ubuntu中默认使用的脚本解释器。
(2)脚本中的注释使用#,#开头的行是注释行。如果有多行需要注释,每行前面都要加#。(#就相当于是C语言中的//)
(3)shell程序的正文,由很多行shell语句构成。

shell编程学习1

.1、shell中使用linux命令
(1)练习1:当前目录下创建文件a.txt
(2)练习2:当前目录下创建文件夹dir,dir下创建文件b.txt
总结:以上2个练习的目的是让大家基本学会写脚本,明白脚本编程其实就是把以前在命令行下输入的命令挪到脚本程序中去然后一次执行。

.2、shell中的变量定义和引用
(1)变量定义和初始化。shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C语言不同。在shell编程中定义变量不需要制定类型,也没有类型这个概念。
(2)变量定义时可以初始化,使用=进行初始化赋值。在shell中赋值的=两边是不能有空格的。
注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。
(3)变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符 ,这个符 的值就是最后一个给他赋值时的值。
(4)变量引用。shell中引用一个变量必须使用$符 ,$符 就是变量解引用符 。
注意:$符 后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会 错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。
注意:变量引用的时候可以$var,也可以${var}这两种的区别是在某些情况下只能用${var}而不能简单的$var

3、shell中无引用、单引 和双引 的区别
(1)shell中使用字符串可以不加双引 ,直接使用。而且有空格时也可以,但是缺陷是不能输出”或者其他转义字符
(2)shell中也可以使用单引 来表示字符串,也是直接使用的,不能输出转义字符

(3)单引 中:完全字面替换(不可包含单引 本身)
(4)双引 中:
$加变量名可以取变量的值
反引 仍表示命令替换
$表示$的字面值 输出$符
`表示`的字面值
“表示””的字面值
\表示的字面值
除以上情况之外,在其它字符前面的无特殊含义,只表示字面值。

shell编程学习2

1、shell中调用linux命令

(1)直接执行
(2)反引 括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引 (键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。

2、shell中的选择分支结构
(1)shell的if语言用法很多,在此只介绍常用的,其他感兴趣可以自己去学
(2)典型if语言格式
if [表达式]; then
xxx
yyy
zzz
else
xxx
ddd
uuu
fi
(3)if的典型应用
判断文件是否存在。(-f),注意[]里面前后都有空格,不能省略。
判断目录是否存在  (-d)
判断字符串是否相等(””str1″” = “”str2″”),注意用一个等 而不是两个
判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le) 回忆一下在ARM裸机中讲述ARM汇编条件执行时,曾经用过这些条件判断的缩写。(eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal
判断字符串是否为空(-z)

(4)if判断式中使用“-o”表示逻辑或
相当于C语言中在if后面的条件式中用逻辑与、逻辑或来连接2个式子,最终的if中是否成立取决于2个式子的逻辑运算结果。

(5)逻辑与&&和逻辑或||与简写的if表达式相结合
 [ -z $czg ] || echo “”not””

shell中的循环结构

1、for循环
要求:能看懂、能改即可。不要求能够完全不参考写出来。因为毕竟嵌入式并不需要完全重新手写shell,系统管理员(服务器运维人员,应用层系统级管理开发的才需要完全掌握shell)

2、while循环
(1)和C语言的循环在逻辑上无差别
(2)要注意很多格式要求,譬如:while后面的[]两边都有空格,[]后面有分 分 (如果do放在一行的话),i++的写法中有两层括 。i=$(($i + 1))

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年10月26日
下一篇 2016年10月26日

相关推荐