欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2022-05-23 21:22:26
部分内容选自《Linux命令行与shell脚本编程大全.第3版》1 什么是LinuxLinux可划分为以下四部分:Linux内核GNU工具图形化桌面环境应用程序完整的Linux系统如下图:1.1 Linux内核Linux系统的核心就是内核,内核控制计算机系统上的所有硬件和软件,在必要时分配硬件,并根... ......

部分内容选自《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(默认解释器)

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

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

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


  • 交互式    ——命令行

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

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

  • 非交互式 ——脚本

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

        — 批量执行、效率高;

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


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将局部变量变成全局变量