一、提出问题

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

二、什么是Shell

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

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

三、什么是变量

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

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

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

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

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

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

四、变量的各种操作

  1. 查看环境变量

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

mango@mango:~$ printenv HOME
/home/mango
mango@mango:~$ printenv
SHELL=/bin/bash
SESSION_MANAGER=local/mango:@/tmp/.ICE-unix/1441,unix/mango:/tmp/.ICE-unix/1441
QT_ACCESSIBILITY=1
COLORTERM=truecolor
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
XDG_MENU_PREFIX=gnome-
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GTK_IM_MODULE=fcitx
LANGUAGE=en_US:en
QT4_IM_MODULE=fcitx
LC_ADDRESS=zh_CN.UTF-8
GNOME_SHELL_SESSION_MODE=ubuntu
LC_NAME=zh_CN.UTF-8
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
XMODIFIERS=@im=fcitx
DESKTOP_SESSION=ubuntu

可以同时打印多个变量

mango@mango:~$ printenv USER  PWD
mango
/home/mango

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

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

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

mango@mango:~$ printenv | grep USER
USERNAME=mango
USER=mango

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

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

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

mango@mango:~$ shellVar=hello
mango@mango:~$ echo $shellVar
hello

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

mango@mango:~$ printenv shellVar
mango@mango:~$ set | grep shellVar
shellVar=hello

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

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

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

mango@mango:~$ export shellVal
mango@mango:~$ printenv shellVal
hello
mango@mango:~$ bash
mango@mango:~$ printenv shellVal
hello
  1. 固化环境变量

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

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

sudo nano ~/.bashrc

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

export shellVal=hello

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

source ~/.bashrc

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

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

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

export shellVal=hello

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

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. js 垃圾回收 & js GC

    js 垃圾回收 & js GC js GC / js Garbage Collector https://developer.mozilla.org/en-US/docs/Web/JavaSc ...

  2. useful life skills website

    useful life skills website 绳子打结技巧 https://www.animatedknots.com/complete-knot-list tools https://tab ...

  3. React In Depth

    React In Depth React Component Lifecycle https://reactjs.org/docs/react-component.html https://react ...

  4. Object to Array

    Object to Array objectToArray(obj = {}, title = `标题`){ let datas = []; if(Object.keys(obj).length) { ...

  5. c++ string split function

    #include <string> #include <vector> #include <regex> struct SplitListItem { std::s ...

  6. NGK官方又出助力市场计划方案 1万枚VAST任性送

    近期NGK官方的一系列动作,可以说是在向外界宣告:NGK2.0即将来袭,席卷加密数字货币市场.前一段时间,NGK官方宣布,NGK公链布局算力领域,打造NGK算力生态星空计划,并推出了SPC星空币.目前 ...

  7. NGK数字增益平台的算力是什么?

    今年的币价回暖带来了新一轮的"信仰充值",部分投资者对比特币的兴趣从购买向更源头的算力转移.随着比特币开采数量逐渐减少,全网算力一直在增加,算力难度也是越来越高.同时在算力行业中竞 ...

  8. oracle中的in参数超过1000的解决方案

    在oracle中,使用in方法查询记录的时候,如果in后面的参数个数超过1000个,那么会发生错误,JDBC会抛出"java.sql.SQLException: ORA-01795: 列表中 ...

  9. 原生javascript开发计算器实例

    计算器的主要作用是进行数字运算,开发一个计算器功能的web实例,有助于更好的掌握js基础的数字运算能力. 本实例详细分析一个js计算器的开发步骤,学习本教程时最好先具备一些基础的js知识. 计算器包括 ...

  10. JDK源码阅读-ByteBuffer

    本文转载自JDK源码阅读-ByteBuffer 导语 Buffer是Java NIO中对于缓冲区的封装.在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接.但是在J ...