Shell - 01 初探
0、定义-shell
shell,译作:壳、外壳。
在计算机科学中,Shell 称为【壳】(区别于 【核(kernel)】),是一个用C语言编写的程序(性质是一个命令解析器,用于接收用户命令。同时也是一个程序设计语言(脚本编程语言)),它一端连接着【内核】,另一端连接着【用户和其它应用程序】,即 Shell是用户和应用程序 与内核沟通的桥梁。
它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。
程序设计语言分为两类:
- 编译型语言
- 解释型语言
语言类别 | 区别 |
---|---|
编译型语言 | 需要预先将写好的源代码转换成目标代码,这个过程被称作“编译”。运行程序时,直接读取目标代码。由于编译后的目标代码非常接近计算机底层,因此执行效率很高,这是编译型语言的优点 |
解释型语言 | 也叫脚本语言或命令语言。执行这类程序时,解释器需要读取编写的源代码,并将其转换成目标代码,再由计算机运行。因为每次执行程序都多了编译的过程,因此效率有所下降 |
- 作为命令语言:Shell交互式地(Interactive)解释、执行用户输入的命令。这也是Shell执行命令的一种方式。
- 作为程序设计语言:Shell可定义各种变量、参数、函数、流程控制(条件、循环、分支)等等。
1、相关概念-shell
Linux的Shell脚本解释器种类众多,一个系统可以存在多个shell脚本解释器。可以通过cat /etc/shells
命令【查看系统中可登陆的Shell】脚本解释器:以CentOS7为例,它的默认shell是bash
与此相关的词语:
- 【Shell脚本】(shell script),是一种为shell编写的脚本程序,是放在文件中的一串shell和操作系统的命令,用于可被重复使用。其本质是 命令行命令简单的组合到一个文件里头。
- shell、shell script是两个不同的概念。
- 业界说 shell,通常指的是 shell脚本。因习惯和简洁,【shell编程】一般指的是 【shell脚本编程】,不是指开发shell本身。
2、分类-shell
Shell分为两类:
- 1、图形界面Shell(Graphical User Interface shell 即GUI shell):如Windows Explorer
- 2、命令行式Shell(Command Line Interface 即CLI shell):如bash、sh、ksh、csh这些是Unix或Linux系统中的;Windows NT系统的cmd.exe、Windows PowerShell。
- 传统意义上说的 Shell 指的是 命令行式shell,除非特别注明。
各主要操作系统都有自己默认的(缺省的)Shell,如:
- Linux(Red Hat、Slackware、Caldera、CentOS)是 Bourne Again shell(简写为 bash)
- FreeBSD(Unix)是C shell
- Windows 是Windows PowerShell
Linux shell常见版本:
- Bourne shell(
B shell
或sh
):Unix的最初Shell,在Shell编程方面比较优秀 - C Shell(
csh
):在C语言编程方面性能较好 - Bash Shell(
bash
):Bourne Shell的增强版,Linux系统的默认Shell - Korn Shell(
ksh
):综合B Shell和C Shell 的特点于一身 Tcsh
:C Shell的增强版,具有命令行编程接口和历史记录功能
3、Shell能做什么?
Shell脚本,能干什么?? 通过Shell用户可以访问操作系统内核服务
以Linux为例,可完全胜任Linux的日常管理工作,如:文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、甚至能抓取网页内容、压缩文件等等
[root@master sbin]# cat /etc/shells # 这本身就是一句shell命令了
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
4、如何运行一个shell脚本文件?
1)创建并编辑一个shell脚本文件:扩展名随意,可以没有,不过最好是做到见名知意。扩展名并不会影响脚本执行。
[root@master ~]# vim helloworld.sh
#!/bin/bash
echo "Hello World!"
代码解析:
#!
是一个约定标记,它告诉系统这个脚本需要什么解释器来执行,也就是说:使用哪一种Shell,这里指定bash
echo
是Shell的一个内部指令,用于在终端打印出指定的字符串"Hello World!"
2)执行shell脚本文件
赋予当前用户helloworld.sh
的执行权限(刚创建的文件没有执行权限)
[root@master ~]# chmod u+x helloworld.sh #给文件属主增加执行权限
或
[root@master ~]# chmod +x helloworld.sh
执行方式1:
[root@master ~]# helloworld.sh
Hello World!
或 ./表示当前目录下。推荐!!!
[root@master ~]# ./helloworld.sh
执行方式2:
[root@master ~]# /bin/sh helloworld.sh
Hello World!
直接运行shell解释器,它的参数是shell脚本文件名。这种情况下,脚本文件中的这行#!/bin/bash
所指定的解释器是不生效的。
而/bin/bash
和/bin/sh
本身也是可执行脚本文件。
上述这种也叫【批处理(Batch)】,即:用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。
5、多种方式:查看系统中默认Shell【非重点知识,了解即可】
查看当前系统中运行的Shell类型:通过查看当前运行的
SHELL
变量,确定默认的Shell[root@master ~]# echo $SHELL
/bin/bash通过查看创建用户时使用的Shell来确定默认的Shell类型
[root@master ~]# grep root /etc/passwd
root0
root:/root:/bin/bash
operator11
operator:/root:/sbin/nologin
通过查看默认配置文件
/etc/default/useradd
,同时可以通过修改SHELL
变量,修改默认的Shell[root@master ~]# cat /etc/default/useradd
useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash #这里可以修改为其他Shell类型
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes通过
$0
变量来获取当前运行的Shell类型[root@master ~]# echo $0
bash查看某个特定用户的Shell。每个用户都可以有自己特定的Shell
[root@master ~]# grep ^root /etc/passwd
root0
root:/root:/bin/bash
通过
$$
这个变量来获取当前运行的shelld
的进程号(PID),在通过ps -p PID
获取当前运行的SHELL类型[root@master ~]# echo $$
79176
[root@master ~]# ps -p 79176
PID TTY TIME CMD
79176 pts/0 00:00:00 bash
参考文档:
1、shell (计算机壳层)
2、Shell脚本
还没有评论,来说两句吧...