近来小姐姐又犯憨憨错误,问组内小伙伴export命令不会持久化环境变量吗?反正我是问出口了。。然后小伙伴就甩给了我一个《The Linux Command Line》PDF链接。感谢老大不杀之恩~
Shell是命令解释器,它会接受用户输入的各种命令,并传递给操作系统执行。它的作用类似于Windows系统的命令行。在UNIX或Linux系统中,Shell即是用户交互的界面,也是控制系统的脚本语言。当然现在用户也可以选择图形化界面做一些和操作系统的交互。层次示意图如下:
对于初学者来说,可能搞不清楚Shell怎么会有那么多分类,Shell的语法怎么那么随便...
小姐姐结合自己初学Shell傻傻分不清的问题点,主要从Shell的种类,变量的分类,条件测试的表达三个部分来介绍。
Shell的种类shell程序有sh,bash,zsh等分类,我从网上找到一张图可以看出shell程序的发展史。
对于这些Shell程序,其语法或多或少有一些差异,不过我们通常使用的都是bash。
Shell程序信息
在Linux系统我们可以通过一些命令查看或修改当前Shell程序信息。
一般发行版的Linux系统中,默认的shell程序就是bash。我们在写shell脚本时,通常也会在脚本文件头部指定bash作为脚本解释器。
这里多说一句,zsh有时也作为猿媛们的默认shell。zsh语法大多是和bash匹配的,也不会影响shell脚本的执行(因为脚本头部指定bash就还是bash:),也不会影响像小姐姐这样的渣渣使用。用它是因为它有神奇的开源框架 Oh My God.. 哦不,是 Oh My Zsh !!!
后面的内容我们还是以Linux系统中的bash为例来介绍:)
变量的分类Shell是一门动态类型语言和弱类型语言,我们可以把变量理解为KV对,key是变量名,value是变量值。变量大体可以分为环境变量,系统变量,用户定义的变量三类。
环境变量
比如我们经常配置的JAVA_HOME就属于环境变量,这些变量是所有Shell程序运行时都可以使用的变量。关于环境变量的操作命令举例如下:
使用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去执行。
Non-login模式指的是非登录用户状态下开启的shell进程,我们可以通过echo $0区分。
扯这么多是因为配置文件的加载顺序和shell进程是否运行在Interactive和Login模式有关系:D
这是阿姨从网上粘的图。bash支持的配置文件有/etc/profile,~/.bashrc等。
当调用一个Interactive&Login模式的shell进程时,配置文件的加载顺序为:
/etc/profile —>( ~/.bash_profile, ~/.bash_login, ~/.profile)其中之一 —>~/.bash_loginout(退出shell时调用)
当调用一个Interactive&non-Login模式的shell进程时,配置文件的加载顺序为: