Shell(壳程序)是系统的用户界面,提供了用户与内核进行相互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果
只要能够操作应用程序的软件都能够称为壳程序,狭义的壳程序指的是命令行方面的软件,如本文接下来介绍的BASH;广义的壳程序则包括图形用户界面模式的软件,因为图形用户界面其实也能够操作各种应用程序来调用内核工作
Shell根据发展有多种不同的版本,BASH就是其中一个版本,BASH(Bourne Again Shell)是Linux默认使用的版本
变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。就是以一组文字或符号等,来替换一些设置或一串保留的数据。
在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。为了区别于自定义变量,环境变量通常以大写字符来表示
Linux 作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的环境变量会因为用户身份的不同而具有不同的值。如下图:
echo:可以利用echo命令来使用变量,变量在被使用时,前面要加上美元符号$,例如:查看PATH变量的内容:
echo $PATH=:用=可以设置或是修改某个变量的内容,例如要把myname变量内容设置为WangGarrison,则:
myname=WangGarrison变量在设置时,要符合某些规定,否则会设置失败,规则如下:
变量与变量内容以一个=来连接等号两边不能直接接空格变量名称只能是英文字母与数字,且开头不能是数字变量内容有空格可使用单引号或双引号将变量引起来unset:unset可以取消变量,例如取消myname的设置:
unset myname环境变量可以帮我们实现很多功能,包括根目录(主文件夹)的变换、提示字符的显示、执行文件查找的路径等
可以用env与export命令来查看当前shell环境默认的环境变量,env是environment(环境)的简写
envLinux重要的10个环境变量如下表:
环境变量名称作用HOME用户的主目录SHELL用户使用的Shell解释器名称PATH执行文件查找的路径EDITOR用户默认的文本解释器RANDOM随机数的变量LANG语系数据HISTSIZE输出的历史命令记录条数HISTFILESIZE保存的历史命令记录条数PS1Bash解释器的提示符MAIL邮件保存的路径使用set命令可以查看所有变量(含环境变量与自定义变量)
set自定义变量与环境变量的主要差别在于环境变量会被子进程所继续引用,而自定义变量不会,父进程与子进程相关性如下图: 子进程仅仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量。所以原本bash的自定义变量在进入了子进程之后不能在子进程使用,直到子进程exit后才能继续使用
所以要想让父进程的自定义变量可以在子进程使用,则需要把自定义变量转换成环境变量,使用export命令进行转换
export 变量名称export命令的具体介绍
read:用来读取来自键盘输入的变量,可用来与用户交互
read [-pt] variable #-p后面可以接提示字符 -t后面可以接等待的秒数declare,typeset:declare或typeset是一样的功能,就是声明变量的类型
declare [-aixr] variable -a:将后面名为variable的变量定义成为数组(array)类型 -i:将后面名为variable的变量定义成为整数(integer)类型 -x:用法与export一样,就是将后面的variable变成环境变量 -r:将变量设置成为readonly类型,该变量不可被更改内容,也不能unset在默认情况下,变量类型默认为字符串,如下图中变量a默认是字符串2+3+4 数组(array)变量类型
var[index]=content #数组名为var,下标是index,内容是content,例如:
命令别名设置:alias、unalias
alias lm='ls -al | more' #把ls -al |more命令简化为lm直接敲alias可以查看当前有哪些命令别名。如下图: 删除命令别名
unalias lm历史命令
history [n] history [-c] history [-raw] 选项与参数: n:列出最近的n条命令行表 -c:将目前的shell中的所有history内容全部清除 -a:将目前新增的history命令新增入histfiles中,若没有histfiles,则默认写入~/.bash_history -r:将histfiles的内容读到目前这个shell的history中 -w:将目前的history记录内容写到histfiles中当我们以bash登录Linux主机之后,系统会主动地由家目录~/.bash_history读取以前曾经执行过的命令,该目录会记录的数据数目,就与bash的HISTFILESIZE这个环境变量有关
Shell Script即Shell脚本,是针对shell所写的脚本。我们将一些shell规定的语法与命令,再搭配正则表达式、管道命令与数据流重定向等功能,写成一个纯文本文件以达到我们想要的处理目的,再配以“.sh”的扩展名,这便是“Shell script”
简言之,我们只有通过Shell 这个工具来解释我们的命令等请求,才能成功实现与计算机的交流,同时再搭配Shell script这个可以批量处理命令的“程序”,我们就可以与计算机更好的交流
《鸟哥的Linux私房菜》第四版 第10章认识与学习BASH