Shell 基础

Shell 发展史
1971 : Bell Labs 的 Ken Thompson 为 UNIX 开发了第一个 Shell: V6 Shell 是一个在内核之外执行的独立的用户程序
1977 :Steven Bourne 在 AT&T Bell Labs 为 V7 UNIX 创建 Bourne shell
1978 :Bill Joy 在伯克利分校攻读研究生期间为 BSD UNIX 系统开发的 csh
1983 : Ken Greer 在卡内基-梅隆大学开发了 tcsh,将 C Shell 引入了 Tenex 系统中的一些功能,如命令行编辑功能和文件名和命令自动补全功能
1983 :David Korn 在 AT&T Bell Labs 创建 korn shell,它功能更强大,提供关联数组表达式运算
1989 :Bourne-Again Shell(或 Bash)是一个开源 GNU 项目,旨在取代 Bourne shell;Bash 由 Brian Fox 开发,已成为世上最流行的 Shell,它兼容 sh、csh、ksh,是 Linux 系统的默认 Shell
在 Linux 中,有多种 Shell 程序可供选择,比如 dash、csh、zsh 等,Bash 也是大多数Linux 系统默认的 Shell。默认的 Shell 可以在 /bin/sh 查看,在etc/passwd 中修改。

Shell 基础

1、Shell :shell是基于C语言编写的程序,是用户使用Linux的桥梁。

2、Shell :shell是系统的用户界面和用户接口,是人和操作系统的交互接口(还包含操作系统内核)

3 、Shell :shell既是一种命令行解释器 (类比于编译器),还是一种程序设计语言(shell是一个功能强大的编程语言,易编写,易调试,灵活性强)

4、Shell :关于shell脚本和shell编程,编写完成后不需要编译,直接运行源码即可。

Shell 脚本的优势在于处理偏操作系统底层的业务,因为有 1000 多个 Linux 系统命令为它作支撑,特别是 Linux 正则表达式以及三剑客 grep、awk、sed 等命令。对于一些常见的系统脚本,使用 Shell 开发会更简单、更快速,例如,让软件一键自动化安装、优化,监控报警脚本,软件启动脚本,日志分析脚本等,虽然 Python 也能做到这些,但是考虑到掌握难度、开发效率、开发习惯等因素,使用 Shell 更符合 Linux 运维简单、易用、高效的三大原则。
 

shell是一种脚本语言

Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,这和使用 C++、C#、Java、Python 等常见的编程语言并没有什么两样。

Shell 虽然没有 C++、Java、Python 等强大,但也支持了基本的编程元素,例如:

  • if...else 选择结构,case...in 开关语句,for、while、until 循环;
  • 变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
  • 函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。


站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。

Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建 Web 运行环境、日志分析等,Shell 都非常合适。

使用 Shell 的熟练程度反映了用户对 Linux 的掌握程度,运维工程师、网络管理员、程序员都应该学习 Shell。

尤其是 Linux 运维工程师,Shell 更是必不可少的,是必须掌握的技能,它使得我们能够自动化地管理服务器集群,否则你就得一个一个地登录所有的服务器,对每一台服务器都进行相同的设置,而这些服务器可能有成百上千之多,会浪费大量的时间在重复性的工作上。

任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。

有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。

这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。

而有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。

这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。

编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。

脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。

Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。​

一个shell脚本是怎么样建立的呢
1、Shell环境:Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

shell脚本都是一个个尾缀为.sh的可执行文件,执行文件里面内容是我们今天分享的主角。

#!是shell脚本的起始,如下所示,而这个起始被称为shebang。

#!/bin/bash

其中/bin/bash 是bash的路径​

2、编写shell脚本

[root@haoming shell]# cat hello.sh 
#!/bin/bash    
echo "hello world"  

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

echo 命令用于向窗口输出文本。

2、执行shell脚本

方式一:运行bash解释器,采用bash或sh + 脚本的相对路径或绝对路径(不用赋予脚本x可执行权限)

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,本质是bash解释器帮你执行脚本,所以脚本本身不需要执行权限。

bash:

[root@haoming shell]# bash ./hello.sh   相对路径
hello world
[root@haoming shell]# bash /home/shell/hello.sh  绝对路径
hello world

sh:

[root@haoming shell]# sh ./hello.sh 
hello world
[root@haoming shell]# sh /home/shell/hello.sh 
hello world

方式二:shell脚本作为可执行程序,通过相对路径或绝对路径执行(常用)

本质是脚本需要自己执行,所以需要执行权限

[root@haoming shell]# chmod +x hello.sh   #使脚本具有执行权限
[root@haoming shell]# ll  #查看权限
total 4
-rwxr-xr-x 1 root root 31 Apr 24 17:43 hello.sh
[root@haoming shell]# /home/shell/hello.sh   #执行脚本  绝对路径
hello world
[root@haoming shell]# ./hello.sh   #执行脚本  相对路径
hello world

注意,相对路径一定要写成 ./hello.sh,而不是 hello.sh,运行其它二进制的程序也一样,直接写 hello.sh,linux 系统会去 PATH 里寻找有没有叫 hello.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成hello.sh 是会找不到命令的,要用 ./hello.sh 告诉系统说,就在当前目录找。

方式三:在脚本的路径前加上 source 或 .

#加上 source 
[root@haoming shell]# source hello.sh 
hello world
[root@haoming shell]# source /home/shell/hello.sh 
hello world

#加上 . 这个.是一个命令,不是指当前工作目录
[root@haoming shell]# . /home/shell/hello.sh 
hello world
[root@haoming shell]# . hello.sh 
hello world


父子进程介绍

执行shell脚本中的方式一和方式二本质上都是在当前shell 中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell 中。方式三直接在当前的shell环境中执行脚本内容,无需打开子shell进程。
子shell 与父 shell 的区别就在于环境变量的继承关系,如在子shell中设置的当前变量,在父 shell中是不可见的。

父子shell测试:

# 查看进程间的父子关系,只有一个父shell
[root@haoming ~]# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root      3181 32120  0 14:10 pts/2    00:00:00 ps -f
root     32120 32117  0 13:39 pts/2    00:00:00 -bash
# 在当前父shell进程下开启子shell进程
[root@haoming ~]# bash
# 查看进程间的父子关系,子shell的PPID指向父shell的 PID
[root@haoming ~]# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root      3360 32120  0 14:12 pts/2    00:00:00 bash
root      3379  3360  0 14:12 pts/2    00:00:00 ps -f
root     32120 32117  0 13:39 pts/2    00:00:00 -bash
# 退出子shell
[root@haoming ~]# exit
exit
[root@haoming ~]# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root      3399 32120  0 14:12 pts/2    00:00:00 ps -f
root     32120 32117  0 13:39 pts/2    00:00:00 -bash

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值