操作系统 内核与用户之间的绝缘层 嵌入式开发中的 Linux (操作系统内核的概念)

嵌入式开发之Linux操作系统的内核kernel与用户之间的绝缘层-Shell详解

什么是shell?Shell是一个命令解析器,是介于Linux操作系统的内核(kernel)与用户之间的一个绝缘层。shell脚本就是讲各类命令预先放入其中,繁难一次性性口头的一个程序言件,关键用于繁难治理员启动设置或许治理。

序员的角度来看,Shell自身是一种用C言语编写的程序,从用户的角度来看,Shell是用户与linux操作系统沟通的桥梁。用户既可以输入命令口头,又可以应用Shell脚本编程,成功愈加复杂的操作。在LinuxGUI日益完善的当天,在系统治理等畛域,Shell编程依然起着无法漠视的作用。深化地了解和熟练地把握Shell编程,是每一个Linux用户的必经功课之一。

Linux的Shell种类泛滥,经常出现的有:BourneShell(/usr/bin/sh或/bin/sh)、BourneAgainShell(/bin/bash)、CShell(/usr/bin/csh)、KShell(/usr/bin/ksh)、ShellforRoot(/sbin/sh),等等。不同的Shell言语的语法有所不同,所以不能交流经常使用。每种Shell都有其特征之处,基本上,把握其中任何一种就足够了。在本文中,咱们关注的重点是Bash,也就是BourneAgainShell,由于易用和收费,Bash在日常上班中被宽泛经常使用;同时,Bash也是大少数Linux系统自动的Shell。在普通状况下,人们并不辨别BourneShell和BourneAgainShell,所以,在上方的文字中,咱们可以看到#!/bin/sh,它雷同也可以改为#!/bin/bash。

应用vi等文本编辑器编写Shell脚本的格局是固定的,如下:

[cpp]viewplaincopy

1.#!/bin/sh

3.#comments

5.Yourcommandsgohere

首行中的符号#!通知系统其后门路所指定的程序即是解释此脚本文件的Shell程序。假设首行没有这句话,内口头脚本文件的时刻,将会发生失误。后续的局部就是主程序,Shell脚本像初级言语一样,也有变量赋值,也有控制语句。除第一行外,以#扫尾的行就是注释行,直到此行的完结。假设一行未成功,可以内行尾加上",这个符号标明下一行与此行集兼并为同一行。

编辑终了,将脚本存盘为filename.sh,文件名后缀sh标明这是一个Bash脚本文件。口头脚本的时刻,要先将脚本文件的属性改为可口头的:

chmod+xfilename.sh

口头脚本的方法是:

./filename.sh

上方咱们从经典的helloworld入手,看一看最繁难的Shell脚本的容貌。

[cpp]viewplaincopy

1.#!/bin/sh

2.#printhelloworldintheconsolewindow

3.a="helloworld"

ShellScript是一种弱类型言语,经常使用变量的时刻无需首先申明其类型。新的变量会在本地数据区调配内存启动存储,这个变量归以后的Shell一切,任何子进程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:

variable_name=variable_value

假设对一个曾经有值的变量赋值,新值将取代旧值。取值的时刻要在变量名前加$,$variable_name可以在引号中经常使用,这一点和其余初级言语是显著不同的。假设发生混杂的状况,可以经常使用花括号来辨别,例如:

echo"Hi,$as"

就不会输入Hi,helloworlds,而是输入Hi,。这是由于Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:

echo"Hi,${a}s"

单引号中的变量不会启动变量交流操作。

对于变量,还须要知道几个与其关系的Linux命令。

env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量以后的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。

上方咱们来看几个例子,联合这个例子,咱们来讲述ShellScript的语法。

shell程序设计

一、经常使用test测试编写unload程序,到达文件卸载的配置。

关键调查的是判别语句的经常使用test

代码如下:

[cpp]viewplaincopy

1.#!/bin/bash

2.#uploadprogramtobackupandremovefiles

3.#syntax:unloaddirectory

4.#checkarguments

5.if[$#-ne1]

7.echo"usage:$0<directory>"

10.#checkforvaliddirectoryname

11.if[!-d$1]

13.echo"$1isnotadirectory"

18.ls-a|cpio-o>/dev/null

19.if[$?-eq0]

23.echo"Aproblemhasoccuredincreatingbackup"

24.echo"Thedirectorywillnotbecreased"

25.echo"Pleasecheckthebackupdevice"

28.#endofunload

1、修正文件属性为其参与可口头权限

[cpp]viewplaincopy

1.fs@ubuntu:~/qiang/shell$chmod777shell1.sh

2、检查test

[cpp]viewplaincopy

1.fs@ubuntu:~/qiang/shell$lstmp

2.prog2.shprog5.shprog7.shsh2.shsh4.shsh6.sh

3.prog3.shprog6.shsh1.shsh3.shsh5.shsh7.sh

3、口头脚本文件

[cpp]viewplaincopy

1.fs@ubuntu:~/qiang/shell$./shell1.shtmp

4、结果:

[cpp]viewplaincopy

1.fs@ubuntu:~/qiang/shell$lstmp

2.fs@ubuntu:~/qiang/shell$

结果目录里没有文件

附:这里繁难解说一下cpio命令的经常使用

cpio[选项]>文件名或许设施名

cpio[选项]<文件名或许设施名

[配置]

cpio命令是经过重定向的方式将文件启动打包备份,恢复恢复的工具,它可以解压以.cpio或许.tar开头的文件。

[形容]

选项说明:详细选项说明参看下表

选项含意

-o将文件拷贝打包成文件或许将文件输入到设施上。

-i将打包文件解压或许将设施上的备份恢复到系统。

-t检查cpio打包的文件内容或许输入到设施上的文件内容。

-v显示打包环节中的文件称号。

-d在cpio恢复文件的环节中,智能的建设相应的目录。

-c一种较新的存储方式。

-B让自动的Blocks可以增大到5120bytes,自动Blocks为512bytes,这样做的好处是可以放慢存取速度。

留意,

1)cpio恢复的门路,假设cpio在打包备份的时刻用的是相对门路,那么在恢复的时刻会智能恢复到这些相对门路下,同理,假设在打包备份用的是相对门路,恢复时也将恢复到相对门路下。

2)cpio无法间接读取文件,它须要每个文件或许目录的完整门路名能力识别读取,而find命令的输入刚好做到了这点,因此,cpio命令普通和find命令配合经常使用。

3)cpio恢复的时刻不会智能笼罩同名文件。

4)不会创立目录而是间接解压到以后文件夹。

二、编写脚本你检查以后目录下的文件属性(是普通文件还是目录)

调查的是for语句和判别语句if...else...

代码如下:

[cpp]viewplaincopy

1.#!/bin/bash

5.if[-f$i]

7.echo"$iisafile"

9.if[-d$i]

11.echo"$iisadirectory"

1、修正文件属性为其参与可口头权限

[cpp]viewplaincopy

1.fs@ubuntu:~/qiang/shell$chmod777shell2.sh

2、口头脚本文件

[cpp]viewplaincopy

1.fs@ubuntu:~/qiang/shell$./shell2.sh

3、结果:

[cpp]viewplaincopy

1.fs@ubuntu:~/qiang/shell$./shell2.sh

2.prog2.shisafile

3.prog3.shisafile

4.prog5.shisafile

5.prog6.shisafile

6.prog7.shisafile

7.sh1.shisafile

8.sh2.shisafile

9.sh3.shisafile

10.sh4.shisafile

11.sh5.shisafile

12.sh6.shisafile

13.sh7.shisafile

14.shell1.shisafile

15.shell2.shisafile

16.tmpisadirectory

17.fs@ubuntu:~/qiang/shell$

三、Shell函数经常使用实例

[cpp]viewplaincopy

1.#!/bin/bash

3.check_user()

5.usr=`who|grep$1|wc-l`

6.if[$usr-eq0]

10.return1

14.whiletrue

16.echo"Inputusername:"

17.readusername

18.check_user$username

19.if[$?-eq1]

21.echo"usr$usernameonline"

23.echo"usr$usernameoffline"

输入结果:

附:

shell、控制台、终端的区别:

终端(terminal,或许叫物理终端):

是一种设施,不是一个程序,普通说的就是能提供命令行用户界面的设施,典型的是屏幕和键盘,或其余的一些物理终端。

虚构终端:

屏幕和键盘只是一个终端,或许不够用,又不想参与设施投入,就发生了虚构终端。

gnome-terminal,urxvt,mlterm,xterm等等是一个程序,职责是模拟终端设施,和虚构终端的区别外表上在于它以GUI方式的窗口发生,外部则是程序结构和系统控制结构有所不同,但实质上差不多。

控制台(console):

显示系统信息的终端就叫控制台,Linux自动一切虚构终端都是控制台,都能显示系统信息。

shell是一个形象概念,shell的一切操作都在计算机外部,担任解决人机交互,口头脚本等,是操作系统能反常运转的关键组成局部,bash,ash,zsh,tcsh等是shell这个形象概念的一种详细的成功,都是一个程序,都能生成一个进程对象。

1分不嫌少!赏积分打赏现金打赏 积分

友谊揭示:打赏的积分将从您的工控网积分账号扣除

本文原创来源:电气TV网,欢迎收藏本网址,收藏不迷路哦!

相关阅读

添加新评论