一、提出问题

在平时的工作中,我们经常会碰到设置环境的问题,例如将应用的执行路径添加到PATH中,方便程序的执行;在Linux中更多的时候是跟shell打交道,很多通过shell启动的应用或者服务都需要设置环境变量,例如启动es需要设置一些环境变量,那么Shell到底是什么?Shell又跟环境变量有什么关系?

二、什么是Shell

我们知道计算机的CPU只能执行二进制表示的机器语言,在计算的早期,只有极少数的人才可以使用二进制语言来操纵计算机,这对我们所有人来说都是很难阅读和编写的,极大的提高了计算机的使用门槛。后来发展出来了操作系统,并在操作系统中提供了一个称为Shell的特殊程序,Shell接收用户输入的的英语指令,并将它将传递给操作系统的内核进行执行。从开发语言的角度上来说,shell脚本是一种面向计算机用户的脚本语言,而Shell程序就是这种脚本语言的解释器。Shell不是系统内核的一部分,但是使用系统内核执行程序,创建文件等。

shell、普通应用程序及操作系统内核的关系如下图

三、什么是变量

跟其他的高级开发语言一样,Shell里边的数据也需要保存在变量中。像任何程序一样,Shell使用变量来控制其行为,并且可以通过更改其值来更改Shell和其他程序的行为。

同样变量也有自己的命名规则

  • 变量名称区分大小写。按照约定,环境变量应具有大写名称。
  • 当给变量赋多个值时,它们必须用冒号分隔:。
  • 等号周围没有空格=。

    变量可以分为两大类,环境变量和外壳变量。

    环境变量是在整个系统范围内可用的变量,并由所有衍生的子进程和外壳程序继承。

    Shell变量是仅适用于当前Shell实例的变量。

四、变量的各种操作

  1. 查看环境变量

使用printenv来查看环境变量的值,如果不写变量名字,则显示出所有的环境变量

  1. mango@mango:~$ printenv HOME
  2. /home/mango
  3. mango@mango:~$ printenv
  4. SHELL=/bin/bash
  5. SESSION_MANAGER=local/mango:@/tmp/.ICE-unix/1441,unix/mango:/tmp/.ICE-unix/1441
  6. QT_ACCESSIBILITY=1
  7. COLORTERM=truecolor
  8. XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
  9. XDG_MENU_PREFIX=gnome-
  10. GNOME_DESKTOP_SESSION_ID=this-is-deprecated
  11. GTK_IM_MODULE=fcitx
  12. LANGUAGE=en_US:en
  13. QT4_IM_MODULE=fcitx
  14. LC_ADDRESS=zh_CN.UTF-8
  15. GNOME_SHELL_SESSION_MODE=ubuntu
  16. LC_NAME=zh_CN.UTF-8
  17. SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
  18. XMODIFIERS=@im=fcitx
  19. DESKTOP_SESSION=ubuntu

可以同时打印多个变量

  1. mango@mango:~$ printenv USER PWD
  2. mango
  3. /home/mango

也可以使用echo打印变量的值,但是需要在变量前边加上$

  1. mango@mango:~$ echo $USER
  2. mango
  3. mango@mango:~$ echo $USER $PWD
  4. mango /home/mango
  1. 搜索特定变量

可以使用grep命令查找包含某个字符串的所有变量

  1. mango@mango:~$ printenv | grep USER
  2. USERNAME=mango
  3. USER=mango

还有一个set命令,除了可以打印环境变量,同时也包括Shell变量和Shell函数

  1. mango@mango:~$ set | grep USER
  2. USER=mango
  3. USERNAME=mango
  4. local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions);
  1. 定义变量

使用命令行设置变量的最简单方法是键入其名称并直接赋值

  1. mango@mango:~$ shellVar=hello
  2. mango@mango:~$ echo $shellVar
  3. hello

这样定义的是Shell变量,可以使用set查看,但是无法使用printenv查看

  1. mango@mango:~$ printenv shellVar
  2. mango@mango:~$ set | grep shellVar
  3. shellVar=hello

启动子shell无法打印变量的值

  1. mango@mango:~$ echo $shellVal
  2. hello
  3. mango@mango:~$ bash
  4. mango@mango:~$ echo $shellVal
  5. mango@mango:~$
  1. 导出Shell变量

我们可以使用export来导出Shell变量,将其提升为环境变量,这是就可以使用printenv及在子shell里打印

  1. mango@mango:~$ export shellVal
  2. mango@mango:~$ printenv shellVal
  3. hello
  4. mango@mango:~$ bash
  5. mango@mango:~$ printenv shellVal
  6. hello
  1. 固化环境变量

直接使用export导出的环境变量,只是保存在当前回话的内存中,所以关闭Shell后就会丢失;我们需要将环境变量添加到配置文件中。

如果只为当前用户设置,需要编辑.bashrc文件

  1. sudo nano ~/.bashrc

在文件末尾添加下边的语句

  1. export shellVal=hello

保存并退出,重新启动外壳程序后,将应用更改。如果要在当前会话应用更改,需要使用source命令

  1. source ~/.bashrc

如果要为所有用户设置环境变量,需要在/etc/profile.d文件夹中创建一个变量文件

  1. mango@mango:~$ sudo touch /etc/profile.d/mango_env.sh
  2. mango@mango:~$ sudo chmod +x /etc/profile.d/mango_env.sh
  3. mango@mango:~$ sudo nano /etc/profile.d/mango_env.sh

在文件末尾添加下边的语句

  1. export shellVal=hello

保存并退出,重新启动外壳程序后,将应用更改。如果要在当前会话应用更改,需要使用source命令

  1. source /etc/profile.d/mango_env.sh

Linux基础之Shell与变量的更多相关文章

  1. Linux基础之-shell script(变量,运算符,流程控制,函数)

    一.shell script Shell 脚本(shell script),是一种为shell编写的脚本程序.业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell s ...

  2. linux基础之Shell Script入门介绍

    本文介绍下,学习shell script编程的入门知识,通过几个入门实例,带领大家走进shell script的神圣殿堂,呵呵,有需要的朋友参考下. 本文转自:http://www.jbxue.com ...

  3. Linux基础篇–shell脚本编程基础

    本章内容概要  编程基础  脚本基本格式  变量  运算  条件测试  配置用户环境 7.1 编程基础程序:指令+数据程序编程风格:   过程式:以指令为中心,数据服务于指令   对象式:以数据为中心 ...

  4. 【Linux】之shell特殊变量整理

    目录 1. 特殊变量列表 2. 特殊说明 在shell中变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即p ...

  5. linux基础6-bash shell编程

    1. type [-ta] name 一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法. 1.1.判断一个名字当前是否是alias.keyword.functio ...

  6. Linux基础(五) Shell函数

    Shell 函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action ...

  7. 【原创】Linux基础之Shell脚本常用命令

    #!/bin/sh 1 取脚本参数 $# 参数个数$0 当前脚本名$1 第1个参数$n 第n个参数$* 所有参数$@ 所有参数$? 上个命令的状态$$ 当前pid 2 日期 $ dateWed Mar ...

  8. Linux基础(三)Shell test 命令

    Shell test 命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt ...

  9. Linux 基础知识----shell

    1.file title: #!/bin/bash 2.input: echo $1 echo $2 3.if # ifif [ "$1" = "N" ]the ...

随机推荐

  1. Objective C & Swift & iOS & App

    Objective C & Swift & iOS & App https://www.runoob.com/ios/ios-objective-c.html https:// ...

  2. Cookie 政策

    Cookie 政策 合规/隐私协议 https://www.synology.cn/zh-cn/company/legal/cookie_policy Cookie Cookie 政策 生效日期:20 ...

  3. TypeScript 3.7 RC & Optional Chaining

    TypeScript 3.7 RC & Optional Chaining https://devblogs.microsoft.com/typescript/announcing-types ...

  4. VAST重磅出击,NGK网络搜索量超越ETH!

    Wechat指数中,NGK超越ETH,NGK搜索指数是157648点位,单日环比上涨11.95%,ETH搜索指数是115604点位,就连区块链标杆的BTC也仅仅只有171669点位,我们可清楚的看到N ...

  5. ASP.NET Core中如何对不同类型的用户进行区别限流

    老板提出了一个新需求,从某某天起,免费用户每天只能查询100次,收费用户100W次. 这是一个限流问题,聪明的你也一定想到了如何去做:记录用户每一天的查询次数,然后根据当前用户的类型使用不同的数字做比 ...

  6. django学习-8.django模板继承(block和extends)

    1.前言 django模板继承的作用:模板可以用继承的方式来实现复用,减少冗余内容. 一般来说,一个网站里一般存在多个网页的头部和尾部内容都是一致的,我们就可以通过模板继承来实现复用. 父模板用于放置 ...

  7. matlab load函数用法 实例

    一 语法: load(filename) load(filename,variables) load(filename,'-ascii') load(filename,'-mat') load(fil ...

  8. Oracle数据库配置监听程序

    最近在学习Oracle数据库,从安装到配置监听程序基本靠百度... 不得不说百度真的很nice!!! 下面是我的Oracle服务端(PL/SQL Developer)出现的监听程序的问题及我解决的方法 ...

  9. SpringCloud(四):服务注册中心Eureka Eureka高可用集群搭建 Eureka自我保护机制

    第四章:服务注册中心 Eureka 4-1. Eureka 注册中心高可用集群概述在微服务架构的这种分布式系统中,我们要充分考虑各个微服务组件的高可用性 问题,不能有单点故障,由于注册中心 eurek ...

  10. dubbo实战之一:准备和初体验

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...