本文内容来自对 《朱有鹏嵌入式linux核心课程》学习总结
- shell 介绍
- 编写第一个 shell
- 1. 编辑器,编译器,运行方法(脚本的3种执行方法)
- 2. hello world 程序和解释
- 3. shell 并不神秘
- 4. hello world
shell 介绍
1. shell 是操作系统的终端命令行
- shell 可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式。+ 我们可以使用 shell 和操作系统,uboot 等软件系统进行交互。具体来说就是我们通过 shell 给软件系统输入命令然后回车执行。
- 上述的操作方式一般情况下工作很好,但是有缺陷。譬如我们要在 linux 创建一个文件a.c,可以
touch a.c a2.c ... a100.c
如果这个时候还是手工去命令行下执行命令创建也可以,但是很累。最好的做法就是把创建过程写成一个 shell 脚本程序,然后去执行这个 shell 脚本程序,执行这个程序的效果和手工在命令行输入那些命令效果一样的。(回忆在 arm 裸机中安装交叉编译工具链时,创建arm-linux-xxx
的符号链接时)
2. shell 是一类编程语言
- 编写 shell 脚本时使用的语言就是 shell 语言,又叫脚本语言。
- shell 脚本其实是一类语言而不是一个语言。
3. 常用 shell 语言:sh, bash, csh, ksh, perl, python 等
- 在 linux 下常用的脚本语言其实就是 bash,sh;+ perl, python 这样的高级 shell 脚本语言,常用在网络管理配置等领域,系统运维人员一般要学习这些。+ 脚本语言一般在嵌入式中应用,主要是用来做配置。(一个复杂的嵌入式程序是可配置的,配置过程就是用脚本语言来实现的)自然不会使用过于复杂的脚本语言特性,因此只需要针对性的学习即可。+ linux 下最常用的脚本就是 bash, 我们学习也是以 bash 为主。
4. shell 脚本的运行机制:解释运行
- C 语言(C++) 这种编写过程是:编写出源代码(源代码是不能直接运行的)然后编译链接形成可执行二进制程序,然后才能运行;而脚本程序不同,脚本程序编写好后源代码即可直接运行(没有编译链接过程)
- shell 程序是解释运行的,所谓解释运行就是说当我们执行一个 shell 程序时, shell解释器会逐行的解释 shell程序代码,然后一行一行的去运行。(顺序结构)
- CPU 实际只认识二进制代码,根本不认识源代码。脚本 程序源代码其实也不是二进制代码,CPU也不认识,也不能直接执行。只不过脚本程序的编译链接过程不是以脚本程序源代码为单位进行的,而是在脚本运行过程中逐行的解释执行时才完成脚本程序源代码转成二进制的过程(不一定是编译链接,因为这行脚本程序可能早就编译连接好了,这里我们只是调用它)的。
编写第一个 shell
1. 编辑器,编译器,运行方法(脚本的3种执行方法)
- shell 程序是文本格式的,只要是文本编辑器都可以。但是因为我们的 shell 是要在 linux 系统下运行的,所以换行符必须是
'\n'
,而 windows 下的换行符是"\r\n"
,因此 windows 中的编辑器写的 shell 不能在 linux 下运行。所以我们整个课程都是在 linux 下使用 vi 编辑器(实际上是 vim)进行编写调试的。- 编译器不涉及,因为 shell 是解释性语言,直接编辑完就可以运行。- shell 程序运行的多种方法,这里介绍三种方法: 第一种:./xx.sh
,和运行二进制可执行程序方法一样。这样运行 shell 要求 shell 程序必须具有可执行权限。chmod a+x xx.sh
来添加可执行权限。 第二种:source xx.sh
,source 是 linux 的一个命令,这个命令就是用来执行脚本程序的。这样运行不需要脚本具有可执行权限。 第三种:bash xx.sh
,bash是一个脚本程序解释器,本质上是一个可执行程序。这样执行相当于我们执行了 bash 程序,然后把 xx.sh 作为argv[1]
传给他运行。
2. hello world 程序和解释
- shell 程序的第一行一般是:
#!/bin/sh
这行话以#!
开始,后面加上一个pathname,这行话的意思是指定 shell 程序执行时被哪个解释器解释执行。所以我们这里写上/bin/sh
意思就是这个shell将来被当前机器中/bin目录下的sh可执行程序执行。 也可以将第一行写为:#!/bin/bash
来指定使用bash执行该脚本。
注意:在 ubuntu 上在默认使用的解释器 sh 其实不是 bash,而是dash。dash是ubuntu中默认使用的脚本解释器。 - 脚本中的注释使用
#
,#
开头的行是注释行。如果有多行需要注释,每行前面都要加#
。(#
就相当于C语言中的//
)- shell 程序的正文,由很多行 shell 语句构成。
3. shell 并不神秘
- shell 就是把以前命令行中键入执行的命令写成了程序。shell其实就是为了避免反复的在命令行下手工输入而发明的一种把手工输入步骤记录下来,然后通过执行shell脚本程序就能再次复述原来记录的手工输入过程的一种技术。- shell 编辑完可能直接运行(不需要编译)
4. hello world
编写一个打印 “hello world” 的脚本
#!/bin/sh
echo hello world
执行结果
root@book-virtual-machine:/mnt/hgfs/windows/study-notes/嵌入式/uboot移植/1.补基础之shell和makefile# ./helloworld.sh
hello world!