shell
这个在使用命令行系统的时候再熟悉不过的东西了,就是敲指令,让系统去工作。在linux中,gcc编译完毕之后会有一个a.out文件,可以./a.out直接运行,也可以在环境变量中添加这个可执行文件,就可以直接使用了。shell也是最接近内核的那一层,它可以把数据和指令传递给内核去操作和处理。
父shell
父 Shell 是用于登录某个远程主机或虚拟控制器终端或在 GUI 中运行终端仿真器时所启动的默认的交互式 Shell 。可以认为就是可执行文件的那一层的进程
子shell
子 Shell 是父 Shell 进程调用了 fork()
函数,在内存中复制出一个与父 Shell 进程几乎完全一样的子进程。所以,它有着父亲的资源。
- 子 Shell 继承了父 Shell 的所有环境变量(包括全局和局部变量)
- 可以通过环境变量
BASH_SUBSHELL
(其值表明子 Shell 的嵌套深度)判断是第几层子 Shell(0 说明当前 Shell 不是子 Shell)
孩子shell
孩子 Shell 是父 Shell 进程调用了 fork()
函数后又调用了 execve()
函数来执行新的 shell 命令(比如 bash
),从而覆盖 fork()
复制出来的 Shell 子进程。
- 孩子 Shell 只继承到父 Shell 的全局环境变量(而不能访问到父 Shell 的局部环境变量)
- 可以通过环境变量
SHLVL
(其值表明孩子 Shell 的嵌套深度)判断是第几层孩子 Shell(启动的第一个 Shell 其SHLVL
为 1)
shell全局变量、局部变量、环境变量
环境变量就是都可以使用的变量,全局变量就是shell代码中本文件或者链接的文件可以使用的变量,局部就是shell函数中的变量。
注意力,父shell和子shell之间的变量是独立的,只能在自己的作用范围内生效,子shell是可以追踪到父shell的id号的。
shell功能的必要性?
shell就是为了实现操作系统可以让用户输入来实现操作的一种手段,我们在使用rt-thread中,会发现,有一个cmd宏,可以添加函数进去,这样只要在虚拟串口输入指令,就可以执行对应的函数,这个是一种选择。在嵌入式中,用户的输入端可能就只有几个按钮,你说这怎么可能输入指令呢?如果是一种调试接口或者可执行的交互系统等才有有用的意义,不然就是浪费。在linux,mac,windows这些系统中才有非常有意义的作用。
shell编程
1.解释器
首先就是选择解释器,比如bash。也可以选择python作为解释器,不过这写法就要编程python的写法了哦。
2.变量和数据
然后就是全局变量,局部变量,还有外部的环境变量,这些变量有数字,有文件路径,有字符串等。
3.也是跟c语言一样,顺序判断循环,三大结构。
if elif else switch for while
4.不定长输入
还有就是shell是指令输入和执行的,所以少不了不定长,所以,就要$#、 $1、 $$ 、$* 、$@这些来做类似于argc和argv那些东西,得到数据就处理呗。
5.shell函数定义
这个太经典了。
1 |
|
7.shell格式化
因为一个数据可能是特殊指令,比如date这个是日期,但是shell可能会理解成date这个字符串,所以,我们就要告诉它是date
就可以了。
8.shell引用
因为shell的变量只是容器,这个和python是一模一样的,所以,你可以把csm这个字符串赋值给一个变量,但是也可以$csm赋值给一个变量。
1 | csm="1234" |
还有$(( ))、
${}、
$()等用法
$()这个会执行一边中间的shell脚本、$(( 运算式 ))、$[]运算式
。
9.正则表达式
shell脚本——正则表达式(包含grep详细介绍及应用)_sh脚本 if 中加 grep-CSDN博客
总结
shell就是一个对可执行文件的操作方法,可以使用编程的方法,让计算机来代替人做繁琐无意义的多次执行。可以说只有在可以操作的人机交互的界面可以使用,怎么说也得有键盘鼠标等或者每个按钮有特殊的控制上下左右。所以,低端的嵌入式设备用不到shell。shell就是执行已经写好的可执行程序罢了,然后执行完毕回到系统,继续下一个shell操作。