Shell中傻傻分不清楚的TOP3

发布文章

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

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

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

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

Shell的种类

shell程序有shbash,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 ,--norc等。这些参数的含义值可以使用man bash进一步了解。只要保持默认值,其实就是我们上面介绍的配置文件加载顺序。

还有,在发行版的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/

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 ,--norc等。这些参数的含义值可以使用man bash进一步了解。只要保持默认值,其实就是我们上面介绍的配置文件加载顺序。

还有,在发行版的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/

Shell中傻傻分不清楚的TOP3的更多相关文章

  1. JS魔法堂:属性、特性,傻傻分不清楚

    一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...

  2. MVP MVC MVVM 傻傻分不清

    最近MVC (Model-View-Controller) 和MVVM (Model-View-ViewModel) 在微软圈成为显学,ASP.NET MVC 和WPF 的Prism (MVVM Fr ...

  3. Java:接口和抽象类,傻傻分不清楚?

    01. 来看网络上对接口的一番解释: 接口(英文:Interface),在 Java 编程语言中是一个抽象类型,是抽象方法的集合.一个类通过继承接口的方式,从而来继承接口的抽象方法. 兄弟们,你们怎么 ...

  4. [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!

    十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...

  5. OCA,OCP,OCM傻傻分不清?

    可能大家知道OCA.OCP.OCM的关系是一个比一个难考,一个比一个含金量高,但是你知道具体的考试科目.考试方式.就业形势区别吗?不知道的话这篇通俗易懂的文章会让你一目了然. 区别一:含金量 ■OCA ...

  6. 学点经济学:M0、M1、M2、M3,傻傻分不清?(转载)

    来源:http://t.10jqka.com.cn/pid_97006727.shtml 学点经济学:M0.M1.M2.M3,傻傻分不清? 25,508人浏览 2018-08-03 11:06 常听人 ...

  7. 【华为敏捷/DevOps实践】7. 敏捷,DevOps,傻傻不分清楚【华为云技术分享】

    文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 敏捷是什么?DevOps是什么?两者有什 ...

  8. 傻傻分不清之 Cookie、Session、Token、JWT

    傻傻分不清之 Cookie.Session.Token.JWT 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打 ...

  9. ASCII、Unicode、UTF-8、UTF-8(without BOM)、UTF-16、UTF-32傻傻分不清

    ASCII.Unicode.UTF-8.UTF-8(without BOM).UTF-16.UTF-32傻傻分不清 目录 ASCII.Unicode.UTF-8.UTF-8(without BOM). ...

随机推荐

  1. layui常见弹窗使用方法

    1:confim类型使用方法 layui.use('layer', function(){ layer.confirm('是否立即上传卷宗信息?', {    btn: ['是','否'],    t ...

  2. springMVC 重定向带参数

    重定向时经常需要带上一定的标志位参数,当然,强大的springmvc提供了便利的操作. 只需要在方法参数中添加RedirectAttributes 或其子类即可! @RequestMapping(&q ...

  3. 你了解C#的协变和逆变吗

    从C# 4.0开始,泛型接口和泛型委托都支持协变和逆变,由于历史原因,数组也支持协变. 里氏替换原则:任何基类可以出现的地方,子类一定可以出现. 协变(out) 协变:即自然的变化,遵循里氏替换原则, ...

  4. PG 更新统计信息

    http://blog.chinaunix.net/uid-24774106-id-3802225.html 一.vacuum的效果: 1.1释放,再利用 更新/删除的行所占据的磁盘空间. 第一点的原 ...

  5. 多线程(thread+queue 售票)

    一.理解 如果线程里每从队列里取一次,但没有执行task_done(),则join无法判断队列到底有没有结束,在最后执行个join()是等不到结果的,会一直挂起.可以理解为,每task_done一次 ...

  6. 花费一周刷完两份面试pdf(含答案)轻松拿下了抖音、头条、京东、小米等大厂的offer,成功度过程序员的寒冬。

    整理出一篇Java进阶架构师之路的核心知识,同时也是面试时面试官必问的知识点,篇章也是包括了很多知识点,其中包括了有基础知识.Java集合.JVM.多线程并发.spring原理.微服务.Netty 与 ...

  7. php实用正则

    1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z ...

  8. json数据写入hbase

    package main.scala.com.web.zhangyong168.cn.spark.java; import org.apache.hadoop.hbase.HBaseConfigura ...

  9. samba修复

    在之前有讲过一个samba无法连接的情况,这次碰到的是samba依赖被弄坏后还原. 注:可能不是很详细,因为时间原因,可能不够完整或缺少记录和截图. 作为记录和参考. 问题:因为对ubuntu系统不太 ...

  10. 读Pyqt4教程,带你入门Pyqt4 _007

    QSlider 滑块是由一个简单的滑柄的窗口组件.该滑柄可以前后拖动,通过这种方式我们可以为特定任务选择值.有时候使用滑块比简单提供数值或使用微调框(spin box)更自然. QLabel 显示文字 ...