20

Shell 中傻傻分不清楚的 TOP 3

 4 years ago
source link: https://mp.weixin.qq.com/s/UofKYTb9hp2FXYIKM5Q3Qw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
RZzeAbu.png!web

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

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

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

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

Shell的种类

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

FfmyYfI.png!web

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

Shell程序信息

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

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

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

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

变量的分类

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

环境变量

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

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

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

  • Interactive & Non-Interactive

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

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 区分。

yiIVZzV.png!web

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

  • 配置文件加载顺序

vaEFbyI.png!web

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

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

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

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

/etc/bash.bashrc —> ~/.bashrc

当调用一个 non-nteractive 模式的shell进程时,通常是执行脚本时,此时配置项是从环境变量中读取和执行的,也就是 env 命令输出的配置项。

另外,在开启一个shell进程中,有一些参数的值也会影响到配置文件的加载。如--rcfile ,--norc等。这些参数的含义值可以使用 man bash 进一步了解。只要保持默认值,其实就是我们上面介绍的配置文件加载顺序。

还有,在发行版的Linux系统中,Interactive&Login模式下的~/.bash_profile, ~/.bash_login, ~/.profile并不一定是三选一,看一下这三个脚本的内容会发现他们会继续调用下一个它想调用的配置文件,这样就可以避免配置项可能需要在不同的配置文件多次配置的弊端了。如centos7.2 中 ~/.bash_profile文件中实际调用了 ~/.bashrc文件。 iUB7fmj.png!web

按照模式和参数设置启动的shell程序的配置文件加载流程图如下:

jEZbumI.png!web

好了,到目前我们总算把环境变量中配置文件的加载顺序理清了。下面列举一些常用的Shell环境变量吧。 NVR7Zry.png!web

系统变量

Shell中系统变量主要在对 参数判断和命令返回值判断 时使用,包括脚本和函数的参数和返回值判断。没啥可说的,主要难记且脚本中经常出现: rEna6n2.png!web

用户自定义的变量

是指我们在使用命令或脚本时定义的变量,因为shell是弱类型语言且语法XX,这里主要谈谈初学时的几个坑爹点:

  • “=” 左右两边不能有空格

3aMJJzB.png!web 你懂我说的意思了吧。。

  • 引用

所谓引用,指的是将字符串用引用符号包括起来,以防止其中的特殊符号被Shell解释为其他涵义。

常用的引用符号如下: NfaiyyI.png!web

  • $

前面我们其实一直在用“$$的作用。

  • Shell中变量名的大小写是敏感的

好了就这么多吧。

条件测试的表达

Shell脚本中除了变量,还经常出现的语法就是条件测试的判断。不会写脚本的开发小姐姐不是好运维,我们来一起侃侃吧。

基本语法

在Shell程序中,当指定的条件为真时,整个条件测试的返回值为 0;反之,如果指定的条件为假时,整个条件测试的返回值为 非0。

条件测试表达式的书写有 test expression[ expression ] 两种形式,注意后者的空格一定不能省!!

脚本中经常出现的有字符串测试、数字测试、文件测试、逻辑操作符测试。我们一起看下:)

字符串测试

ZRNnyq3.png!web

注意:这里运算符 左右两边又一定要有空格了(下同),这样shell才能将之当成命令执行。

数字测试

v2iumy3.png!web

文件测试

yIf2MfI.png!web

逻辑操作符测试

Nb2iY3F.png!web

收藏 在看 转发 起来,小姐姐就算你条件测试过关了>_<

参考资料:

[1].《Shell从入门到精通》

[2].https://www.edureka.co/blog/types-of-shells-in-linux/

[3].http://www.penguintutor.com/linux/basic-shell-reference

[4].https://apple.stackexchange.com/questions/361870/what-are-the-practical-differences-between-bash-and-zsh

[5].https://sunlightmedia.org/bash-vs-zsh/

[6].https://unix.stackexchange.com/questions/439042/debian-read-order-of-bash-session-configuration-files-inconsistent

[7].https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html

[8].http://howtolamp.com/articles/difference-between-login-and-non-login-shell/

[9].https://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK