当前位置: 移动技术网 > 科技>操作系统>Linux > Linux Shell 编程基础(持续更新)

Linux Shell 编程基础(持续更新)

2018年11月21日  | 移动技术网科技  | 我要评论

部分内容选自《linux命令行与shell脚本编程大全.第3版》

1  什么是linux

linux可划分为以下四部分:

  • linux内核
  • gnu工具
  • 图形化桌面环境
  • 应用程序

完整的linux系统如下图:


1.1  linux内核

linux系统的核心就是内核,内核控制计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。

内核主要负责以下四种功能:

  • 系统内存管理
  • 软件程序管理
  • 硬件设备管理
  • 文件系统管理


(1)系统内存管理

管理服务器的可用物理内存,以及创建和管理虚拟内存;

(2)软件程序管理

linux系统将运行中的程序称为进程,内核控制着linux系统如何管理运行在系统上的所有进程。

(3)硬件设备管理

任何linux系统需要与设备通信,都需要在内核代码中加入其驱动程序代码。驱动程序代码相当于应用程序和硬件设备的中间人,允许内核与设备之间交换数据。

linux系统将硬件设备当成特殊的文件,称为设备文件。设备文件有3种分类:

  • 字符型设备文件:处理数据时每次只能处理一个字符设备;
  • 块设备文件:指的是处理数据时每次能处理大块数据的设备,通常用b表示,如硬盘,brw-rw----. 1 root disk 8, 0 8月  19 01:50 /dev/sda
  • 网络设备文件:网卡、回环设备;

linux为系统上的每个设备都创建一种称为节点的特殊文件,与设备的所有通信都通过设备节点完成,比如网卡文件、硬盘文件;

(4)文件系统管理

系统上支持的文件系统


2.2 gnu工具

(1)shell

gnu/linux shell是一种特殊的交互式工具。shell的核心是命令提示符,命令提示符是shell负责交互的部分。允许你输入文本命令,然后解释命令,并在内核中执行。

shell包含一组内部命令,用这些命令可以完成复制文件、移动文件、重命名文件、显示和终止系统中正在运行的程序等操作。shell也允许你在命令行提示符中输入程序的名称,shell会将程序名传递给内核以启动它。

在linux系统中,通常有好几种shell可用,不同的shell有不同的特性,所有linux发行版默认的shell都是bash shell,常见的shell:ash、sh、ksh。



2  什么是shell

在linux内核与用户之间的解释器程序

— 通常指/bin/bash(默认解释器)

— 负责向内核翻译及传达用户/程序指令

—相当于操作系统的“外壳”

image


  • 交互式    ——命令行

— 人工干预、智能化程度高;

— 逐条解释执行、效率低;

  • 非交互式 ——脚本

        — 需要提前设计、智能化难度大;

        — 批量执行、效率高;

        — 方便在后台静悄悄地运行;


shell就类似于汽车这个概念,那么bash就比喻为具体的品牌型号,比如宝马m2、m3。


/etc/shells 这个文件是保存系统中有多少shell可用


如何切换shell呢?

查看/etc/shells文件里面有多少可用的解释器,直接输入解释器名称即可,比如在命令行直接输入ksh就能切换,如果想返回到bash(默认解释器)直接exit即可。

其他的解释器并没有bash好用,所以红帽官方选择它当做默认的解释器!bash有的特性是其他解释器没有的!





bash基本特性

— 快捷键、tab键补全

— 命令历史

— 命令别名

— 标准输入输出

— 重定向

— 管道操作


注意:选项不要过度依赖tab键(针对于7),个人认为选项能不用tab就不要用,命令和文件/目录路径可以使用。


命令历史:默认记录1000条,通过全局变量histsize设置;(记录最好改到100以内,每一条命令操作都会有记录,所以任何人都可以看到,所以为了安全起见)

所有用户生效,配置文件:/etc/profile

命令历史使用:!885或者!cat(最近使用cat的记录)可以重复使用之前输入的命令;

清空命令历史:history -c(但是在每个用户的家目录里边还有个文件.bash_history,历史命令已经保存文件中所以要想彻底清空需要把这个文件删除!删除后会自动生成!)


重定向输出/输出

标准输入,描述号为0;

标准输出,描述号为1;

标准错误,描述号为2;

&:错误信息和正确信息

>:覆盖重定向

>>:追加重定向

输出重定向可以理解为本来要显示在屏幕上内容给它放到文件中,那么输入重定向就是本来要通过键盘输入内容直接从文件中去读取,文件的内容代替了键盘输入;

# mail -s dacui root < note.txt


管道

将一条命令的标准输出交由另一条命令处理





脚本的设计

写脚本的三个步骤:

1、脚本声明(需要的解释器、作者信息等)

2、注释信息(步骤、思路、用途、变量含义等)

   #autor:作者、邮箱

   #version:版本

   #description:描述

3、可执行语句(操作代码)

linux会按照脚本的上下顺序去执行


执行脚本的方式:

1、chmod +x

2、使用绝对路径来运行

3、bash 运行

4、source 运行

脚本的执行一般都是开启子进程的,但是如果使用source命令执行脚本是不开启子进程的;

source 在当前进程执行

例如,目前有一个脚本名称为a.sh,内容为sleep 100,分别使用bash a.sh    ./a.sh    /root/a.sh    source a.sh执行

使用bash a.sh    ./a.sh    /root/a.sh这三种执行都是一样的,开启子进程

[root@server0 sh]# pstree

bash(当前进程)─── bash(脚本开启的子进程)─── sleep


使用source a.sh结果:

[root@server0 sh]# pstree

bash(当前进程)─── sleep


那么开启子进程和不开启子进程有什么区别吗?

没有太多意义,但是有的时候会需要!比如,修改/etc/profile文件中的histsize为20条,配置文件修改不能立即生效,需要在新的终端才生效,此时我不想开新的终端那么就使用source命令去执行即可;

未来90%多的脚本都是按照正常执行,不需要考虑到开不开子进程,少数需要考虑到,特殊情况;




变量


set 查看所有变量

unset 删除变量

env 查看系统自带的变量


位置变量:

$0:脚本名称

$1:第一个参数

$2:第二个参数

$3:第三个参数

...

$*:列出所有参数

$#:列出参数的个数

$$:显示脚本的pid进程号


$?:查看上一条命令的返回状态,两种值,0和非0


引号

" ":把多个内容变成一个整体;

' ':把多个内容变成一个整体,但是单引号屏蔽特殊符号,也就是说在调用变量的使用单引号就无法调用;

$():取命令的结果;

``:取命令的结果;

tar -czf xx.`date +%f`.tar /var/log


read

只定义变量名

-p:提示

stty -echo  不在终端显示输入信息

stty echo 在终端显示输入信息


export将局部变量变成全局变量




如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网