科普 | Shell中傻傻分不清楚的TOP3
liuian 2024-11-28 00:50 127 浏览
文章来源:https://mp.weixin.qq.com/s/UofKYTb9hp2FXYIKM5Q3Qw
原文作者:Monica2333
近来小姐姐又犯憨憨错误,问组内小伙伴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网站拷贝了一段脚本:
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才能将之当成命令执行。
数字测试
文件测试
逻辑操作符测试
对了,在这里说一下,我目前是在职Java开发,如果你现在正在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中缺乏基础入门的视频教程,可以关注并私信我:01。获取。我这里有最新的Java基础全套视频教程。
相关推荐
-
- 手机总是自动关机是怎么回事
-
手机会动不动就关机,可能是手机的电池材质已经开始有变化了,或者在寒冷的地方温度过低也会造成自动关机的,也有可能是因为手机被摔伤过,从手机内的软件破坏了,就会自动关机。造成智能手机自动关机的原因较多,常见的有:误操作开启了定时关机功能;环境温...
-
2025-12-24 00:55 liuian
- 下载gho的网站(ghost官网下载地址)
-
非原版系统的话,去winos里面下载比较靠谱一点https://www.winos.me/
- 联想win7下载链接(联想win7oem原版下载)
-
如果你想在联想小新win7上下载AMD软件,首先要确定你要下载的是哪款软件。然后,你可以前往AMD官方网站,在网站上搜索该软件并下载。在下载完成后,双击安装该软件即可。另外,你也可以通过第三方软件下载...
- 三星笔记本电脑售后服务维修中心
-
您可以通过以下方式查询附近的三星售后服务点:访问三星官方网站,在网站首页选择“售后服务”选项,然后选择“售后服务网点查询”,在弹出的页面中选择所在省份和城市,即可查询附近的售后服务网点。在手机应用商店...
- 电脑重装系统后没有声音怎么解决
-
电脑重装系统后没有声音,可能是声卡驱动未安装、声卡驱动不兼容或者声音相关服务未开启等原因。解决方法可以尝试重新安装声卡驱动、更新驱动程序软件或者打开声音相关设置。如果问题仍然存在,建议寻求专业人士的...
- word2007安装产品密钥(安装office2010产品密钥)
-
可以通过以下方式获取Word文档的产品密钥:购买正版Word软件,从官方渠道获得产品密钥。下载并安装MicrosoftOffice,从安装过程中获取产品密钥。请注意,任何未经授权的方式获取...
-
- 绝地求生电脑配置要求(绝地求生电脑配置要求2024)
-
绝地求生的最低配置国服官方给出的最低配置是内存6G,CPUInteli3-4340/AMDFX-630,显卡GTX660/HD7850,所有效果最低,但是说实话,这个配置玩起来,体验太差,而且没几局就需要重启客户端,而且GTX6...
-
2025-12-23 21:05 liuian
- 亲手自己重装系统win7(自己怎么重装win7)
-
要一键安装重装系统Win7,您可以使用Windows7安装盘或USB驱动器。首先,将安装盘或USB插入计算机,并重启计算机。然后,在计算机启动时按下相应的按键(通常是F12或Del键)进入启动菜单。...
- windows7旗舰版临时激活(win7暂时激活)
-
关于这个问题,目前,有几种方法可以激活Windows7旗舰版,以下是最简单的几种方法:1.使用激活工具:可以使用一些第三方激活工具,如KMSpico、MicrosoftToolkit等工具来激活...
- 免费查序列号入口(免费查序列号入口平板)
-
苹果查序列号入口可登陆苹果官网checkcoverage.apple.com进行查询,具体步骤如下:1、打开手机设置,点击“通用”;2、进入页面后点击“关于本机”;3、页面跳转后,我们就可以看到本机的...
- 磁盘被保护了如何取消保护(磁盘被保护了如何取消保护设置)
-
1、打开磁盘分区管理窗口中选择要去掉被写保护的磁盘。2、选中磁盘后单击鼠标右键可显示出选项列表下选择属性。3、打开磁盘属性对话框中选择点击硬件选项卡。4、然后在硬件页面中选中所有磁盘后再单击属性按钮。...
- win7系统硬盘分区教程(win7如何对硬盘分区)
-
在Win7中,你可以使用磁盘管理工具来给硬盘分区。首先,打开控制面板,点击“系统和安全”,然后选择“管理工具”。在管理工具中,找到“计算机管理”,点击打开。在计算机管理窗口中,选择“磁盘管理”。在磁盘...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
