一、提出问题

在平时的工作中,我们经常会碰到设置环境的问题,例如将应用的执行路径添加到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. Flutter Widgets

    Flutter Widgets Flutter 组件 Syncfusion Flutter Widgets 所有组件均支持即装即用的 Android,iOS和 Web not free https:/ ...

  2. How to change Linux Terminal display username

    How to change Linux Terminal display username 如何更改 Linux Terminal 显示的用户名 (base) ➜ ~ whoami xgqfrms-m ...

  3. Python Coding Interview

    Python Coding Interview Python Advanced Use enumerate() to iterate over both indices and values Debu ...

  4. very useful English Acronyms in Programming for Programmer

    very useful English Acronyms in Programming for Programmer alias / shorthand / acronyms 别名 / 简写 / 缩略 ...

  5. js types & primitive & object

    js types & primitive & object js 数据类型 typeof null // "object" typeof undefined // ...

  6. js 创建XML

    // 创建xml数据 let doc = document.implementation.createDocument('', 'root', null); // 创建一个文档 let root =d ...

  7. HANNAH WHITE:从Facebook谈坚持

    HANNAH WHITE于1993年毕业于加州斯坦福大学,被美国多家知名杂志评为最值得关注经济管理学杰出人才,2006年-2009年担任Doll资本管理公司部门主管,2009年-2013年担任Doll ...

  8. Union international INC评德意志联邦投入十亿欧元重启文化娱乐产业

    当地时间6月4日,德国联邦政府宣布了一项名为"重启文化"(Neustart Kultur)的计划,将投入总计10亿欧元,用以支持德国文化及创意产业的恢复和重建. Union int ...

  9. ASP.NET Core WebApi版本控制

    前言: 在日常项目开发中,随着项目需求不断的累加.不断的迭代:项目服务接口需要向下兼容历史版本:前些时候就因为Api接口为做版本管理导致接口对低版本兼容处理不友好. 最近就像了解下如何实现WebApi ...

  10. 1102 Invert a Binary Tree——PAT甲级真题

    1102 Invert a Binary Tree The following is from Max Howell @twitter: Google: 90% of our engineers us ...