Shell中傻傻分不清楚的TOP3
发布文章
html
近来小姐姐又犯憨憨错误,问组内小伙伴export
命令不会持久化环境变量吗?反正我是问出口了。。而后小伙伴就甩给了我一个《The Linux Command Line》PDF连接。感谢老大不杀之恩~node
Shell是命令解释器,它会接受用户输入的各类命令,并传递给操做系统执行。它的做用相似于Windows系统的命令行。在UNIX或Linux系统中,Shell便是用户交互的界面,也是控制系统的脚本语言。固然如今用户也能够选择图形化界面作一些和操做系统的交互。层次示意图以下:
linux
对于初学者来讲,可能搞不清楚Shell怎么会有那么多分类,Shell的语法怎么那么随便...shell
小姐姐结合本身初学Shell傻傻分不清的问题点,主要从Shell的种类
,变量的分类
,条件测试的表达
三个部分来介绍。express
Shell的种类
shell程序有sh,bash,zsh等分类,我从网上找到一张图能够看出shell程序的发展史。
对于这些Shell程序,其语法或多或少有一些差别,不过咱们一般使用的都是bash。centos
在Linux系统咱们能够经过一些命令查看或修改当前Shell程序信息。
bash
通常发行版的Linux系统中,默认的shell程序就是bash。咱们在写shell脚本时,一般也会在脚本文件头部指定bash做为脚本解释器。
session
这里多说一句,zsh有时也做为猿媛们的默认shell。zsh语法大可能是和bash匹配的,也不会影响shell脚本的执行(由于脚本头部指定bash就仍是bash:),也不会影响像小姐姐这样的渣渣使用。用它是由于它有神奇的开源框架 Oh My God.. 哦不,是 Oh My Zsh !!!app
后面的内容咱们仍是以Linux系统中的bash为例来介绍:)框架
变量的分类
Shell是一门动态类型语言和弱类型语言,咱们能够把变量理解为KV对,key是变量名,value是变量值。变量大致能够分为环境变量
,系统变量
,用户定义的变量
三类。
好比咱们常常配置的JAVA_HOME
就属于环境变量,这些变量是全部Shell程序运行时均可以使用的变量。关于环境变量的操做命令举例以下:
使用export
命令定义的环境变量只在当前运行的shell进程中有效,结束进程就没了。因此咱们要将配置变量定义在令小姐姐懵逼的一系列配置文件中,持久化下来。
提及配置文件,又不得不先提下shell程序和用户的Interactive和Login模式:)
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模式指的是用户成功登陆后开启的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进程时,配置文件的加载顺序为:
/etc/bash.bashrc
—> ~/.bashrc
当调用一个non-nteractive
模式的shell进程时,一般是执行脚本时,此时配置项是从环境变量中读取和执行的,也就是env
命令输出的配置项。
另外,在开启一个shell进程中,有一些参数的值也会影响到配置文件的加载。如--rcfile
man bash
进一步了解。只要保持默认值,其实就是咱们上面介绍的配置文件加载顺序。
还有,在发行版的Linux系统中,Interactive&Login模式下的~/.bash_profile,
~/.bash_login, ~/.profile并不必定是三选一,看一下这三个脚本的内容会发现他们会继续调用下一个它想调用的配置文件,这样就能够避免配置项可能须要在不一样的配置文件屡次配置的弊端了。如centos7.2 中 ~/.bash_profile文件中实际调用了 ~/.bashrc文件。
按照模式和参数设置启动的shell程序的配置文件加载流程图以下:
好了,到目前咱们总算把环境变量中配置文件的加载顺序理清了。下面列举一些经常使用的Shell环境变量吧。
系统变量
Shell中系统变量主要在对参数判断和命令返回值判断时使用,包括脚本和函数的参数和返回值判断。没啥可说的,主要难记且脚本中常常出现:
用户自定义的变量
是指咱们在使用命令或脚本时定义的变量,由于shell是弱类型语言且语法XX,这里主要谈谈初学时的几个坑爹点:
“=” 左右两边不能有空格
你懂我说的意思了吧。。
引用
所谓引用,指的是将字符串用引用符号包括起来,以防止其中的特殊符号被Shell解释为其余涵义。
经常使用的引用符号以下:
前面咱们其实一直在用 “ $变量名 ” 来表示某个 变量名的值,这其实也正是 $ 的做用。
好了就这么多吧。
条件测试的表达
shell脚本中除了变量,还常常出现的语法就是条件测试的判断。不会写脚本的开发小姐姐不是好运维,咱们来一块儿侃侃吧。
在Shell程序中,当指定的条件为真时,整个条件测试的返回值为 0;反之,若是指定的条件为假时,整个条件测试的返回值为 非0。
条件测试表达式的书写有test expression
和 [ expression ]
两种形式,注意后者的空格必定不能省!!
脚本中常常出现的有字符串测试、整数测试、文件测试、逻辑操做符测试。咱们一块儿看下:)
注意:这里运算符 左右两边又必定要有空格了(下同),这样shell才能将之当成命令执行。
整数测试
文件测试
收藏在看转发起来,小姐姐就算你条件测试过关了>_<
感谢大佬这么优秀还关注我~
参考资料:
[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/
Shell中傻傻分不清楚的TOP3
同步滚动:
近来小姐姐又犯憨憨错误,问组内小伙伴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进程时,配置文件的加载顺序为:
/etc/bash.bashrc —>~/.bashrc
当调用一个non-nteractive模式的shell进程时,一般是执行脚本时,此时配置项是从环境变量中读取和执行的,也就是env命令输出的配置项。
另外,在开启一个shell进程中,有一些参数的值也会影响到配置文件的加载。如--rcfile
还有,在发行版的Linux系统中,Interactive&Login模式下的~/.bash_profile,
~/.bash_login, ~/.profile并不必定是三选一,看一下这三个脚本的内容会发现他们会继续调用下一个它想调用的配置文件,这样就能够避免配置项可能须要在不一样的配置文件屡次配置的弊端了。如centos7.2 中 ~/.bash_profile文件中实际调用了 ~/.bashrc文件。
按照模式和参数设置启动的shell程序的配置文件加载流程图以下:
好了,到目前咱们总算把环境变量中配置文件的加载顺序理清了。下面列举一些经常使用的Shell环境变量吧。
系统变量
Shell中系统变量主要在对参数判断和命令返回值判断时使用,包括脚本和函数的参数和返回值判断。没啥可说的,主要难记且脚本中常常出现:
用户自定义的变量
是指咱们在使用命令或脚本时定义的变量,由于shell是弱类型语言且语法XX,这里主要谈谈初学时的几个坑爹点:
“=” 左右两边不能有空格
你懂我说的意思了吧。。
引用
所谓引用,指的是将字符串用引用符号包括起来,以防止其中的特殊符号被Shell解释为其余涵义。
经常使用的引用符号以下:
$
前面咱们其实一直在用 “ 变量名 ” 来表示某个 变量名的值,这其实也正是 的做用。
shell中变量名的大小写是敏感的
好了就这么多吧。
条件测试的表达
shell脚本中除了变量,还常常出现的语法就是条件测试的判断。不会写脚本的开发小姐姐不是好运维,咱们来一块儿侃侃吧。
基本语法
在Shell程序中,当指定的条件为真时,整个条件测试的返回值为 0;反之,若是指定的条件为假时,整个条件测试的返回值为 非0。
条件测试表达式的书写有test expression 和 [ expression ]两种形式,注意后者的空格必定不能省!!
脚本中常常出现的有字符串测试、整数测试、文件测试、逻辑操做符测试。咱们一块儿看下:)
字符串测试
注意:这里运算符 左右两边又必定要有空格了(下同),这样shell才能将之当成命令执行。
整数测试
文件测试
逻辑操做符测试
收藏在看转发起来,小姐姐就算你条件测试过关了>_<
感谢大佬这么优秀还关注我~
参考资料:
[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/