Shell中傻傻分不清楚的TOP3

Shell中傻傻分不清楚的TOP3
发布文章

Shell中傻傻分不清楚的TOP3

近来小姐姐又犯憨憨错误,问组内小伙伴export命令不会持久化环境变量吗?反正我是问出口了。。然后小伙伴就甩给了我一个《The Linux Command Line》PDF链接。感谢老大不杀之恩~

Shell是命令解释器,它会接受用户输入的各种命令,并传递给操作系统执行。它的作用类似于Windows系统的命令行。在UNIX或Linux系统中,Shell即是用户交互的界面,也是控制系统的脚本语言。当然现在用户也可以选择图形化界面做一些和操作系统的交互。层次示意图如下:

Shell中傻傻分不清楚的TOP3

对于初学者来说,可能搞不清楚Shell怎么会有那么多分类,Shell的语法怎么那么随便...

小姐姐结合自己初学Shell傻傻分不清的问题点,主要从Shell的种类,变量的分类,条件测试的表达三个部分来介绍。

Shell的种类

shell程序有shbash,zsh等分类,我从网上找到一张图可以看出shell程序的发展史。

Shell中傻傻分不清楚的TOP3


对于这些Shell程序,其语法或多或少有一些差异,不过我们通常使用的都是bash。

Shell程序信息

在Linux系统我们可以通过一些命令查看或修改当前Shell程序信息。

Shell中傻傻分不清楚的TOP3

一般发行版的Linux系统中,默认的shell程序就是bash。我们在写shell脚本时,通常也会在脚本文件头部指定bash作为脚本解释器。

Shell中傻傻分不清楚的TOP3

这里多说一句,zsh有时也作为猿媛们的默认shell。zsh语法大多是和bash匹配的,也不会影响shell脚本的执行(因为脚本头部指定bash就还是bash:),也不会影响像小姐姐这样的渣渣使用。用它是因为它有神奇的开源框架 Oh My God.. 哦不,是 Oh My Zsh !!!

后面的内容我们还是以Linux系统中的bash为例来介绍:)

变量的分类

Shell是一门动态类型语言和弱类型语言,我们可以把变量理解为KV对,key是变量名,value是变量值。变量大体可以分为环境变量,系统变量,用户定义的变量三类。

环境变量

比如我们经常配置的JAVA_HOME就属于环境变量,这些变量是所有Shell程序运行时都可以使用的变量。关于环境变量的操作命令举例如下:

Shell中傻傻分不清楚的TOP3


Shell中傻傻分不清楚的TOP3

使用export命令定义的环境变量只在当前运行的shell进程中有效,结束进程就没了。所以我们要将配置变量定义在令小姐姐懵逼的一系列配置文件中,持久化下来。

说起配置文件,又不得不先提下shell程序和用户的Interactive和Login模式:)

Interactive & Non-Interactive`

Interactive通常是指读入写出数据都是从用户的terminal,也就是我们平时用命令行打开终端就是Interactive模式,而执行一个shell脚本就是Non-interactive模式。怎么检验当前shell运行的模式是不是Interactive呢?小姐姐从GNU网站拷贝了一段装X脚本:

case "$-" in *i*) echo This shell is interactive ;; *) echo This shell is not interactive ;; esac

结果如上所述。

Login & Non-Login`

Login模式指的是用户成功登录后开启的shell进程,这时候会读取/etc/passwd下用户所属的shell去执行。

Shell中傻傻分不清楚的TOP3


Non-login模式指的是非登录用户状态下开启的shell进程,我们可以通过echo $0区分。

Shell中傻傻分不清楚的TOP3

扯这么多是因为配置文件的加载顺序和shell进程是否运行在Interactive和Login模式有关系:D

Shell中傻傻分不清楚的TOP3


这是阿姨从网上粘的图。bash支持的配置文件有/etc/profile,~/.bashrc等。

当调用一个Interactive&Login模式的shell进程时,配置文件的加载顺序为:

/etc/profile —>( ~/.bash_profile, ~/.bash_login, ~/.profile)其中之一 —>~/.bash_loginout(退出shell时调用)

当调用一个Interactive&non-Login模式的shell进程时,配置文件的加载顺序为:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfgfz.html