linux bash环境变量简单总结

来源链接:http://www.178linux.com/8005

原创文章,如有转载,请注明原文地址

需要简单学习一下. 

其实  我都是直接放一个 .sh文件到 /etc/profile.d 的目录下面

感觉这样最粗暴有效  虽然也可以放 .bash_rc  或者是 .bash_profile 里面 但是 毕竟是单用户的

而且不喜欢改 profile 文件 太复杂了 改坏了很麻烦. 

一.环境变量简介

Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都

是相同的,这个默认环境实际上就是一组环境变量的定义。

环境变量是全局的,设置好的环境变量可以被所有当前用户所运行的程序所使用。

用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。

常见的环境变量:

PATH: 决定了shell将到哪些目录中寻找命令或程序

ROOTPATH: 这个变量的功能和PATH相同,但它只罗列出超级用户(root)键入命令时所需检查的目录。

HOME: 当前用户主目录

USER: 查看当前的用户

LOGNAME: 查看当前用户的登录名。

UID: 当前用户的识别字,取值是由数位构成的字串。

SHELL: 是指当前用户用的是哪种Shell。

TERM : 终端的类型。

PWD 当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。

MAIL: 是指当前用户的邮件存放目录。

HISTSIZE: 是指保存历史命令记录的条数

HOSTNAME: 是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。

PS1: 是基本提示符,对于root用户是#,对于普通用户是$,也可以使用一些更复杂的值。

PS2: 是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符

修改成字符串“Hello,My NewPrompt :) ”。# PS1=" Hello,My NewPrompt :) "

IFS: 输入域分隔符。当shell读取输入时,用来分隔单词的一组字符,它们通常是空格、制表符和换行符。

语言及环境字符集相关的重要环境变量:

相关命令:

stty 显示或设定文字终端设置,主要是按键的代表意义

locale (local environment)查看当前的语系信息

【注:locale -a :查看当前系统所支持的字符集】

LANG 没有设置任何LC_XXX变量时所使用的默认值。

【LANG=zh.CN.UTF-8 gedit a.txt //临时采用其它字符集语言打开指定的应用程序】

LC_ALL 用来覆盖掉所有其他LC_XXX变量的值

LC_COLLATE 使用所指定地区的排序规则

LC_CTYPE 使用指定地区的字符集(即:字母,数字,标点符号等)

LC_MESSAGES 使用所指定地区的响应与信息;【注:仅POSIX适用】

LC_MONETARY 使用指定地区的货币格式

LC_NUMERIC 使用指定地区的数字格式

LC_TIME 使用指定地区的日期与时间格式。

不太常用的实用环境变量:

LD_LIBRARY_PATH 这个变量包含了一系列用冒号隔开的目录,动态链接器将在这些目录里查找库文件。 MANPATH 这个变量包含了一系列用冒号隔开的目录,命令man会在这些目录里搜索man页面。 【注:man帮助目录结构必须为:man/{man1,man2,..man8}, MANPATH=/man】 INFODIR 这个变量包含了一系列用冒号隔开的目录,命令info将在这些目录里搜索info页面。 PAGER 这个变量包含了浏览文件内容的程序的路径(例如less或者more)。 EDITOR 这个变量包含了修改文件内容的程序(文件编辑器)的路径(比如nano或者vi)。

系统位置变量—【仅用于shell脚本中获取命令行传递给脚本的参数】

$0、$1 $2 $3 $4 $5 $6 $7 $8 $9,$* ——>$0到9与windows中0~9的含义一样。

$0:当前执行Shell文件名

$#:命令行中位置参数的个数

$*:获取当前shell的所有参数

$@:此程序的所有参数

系统特殊变量

$?:上一条命令执行后返回的状态,当返回值为0:表执行正常,非0:执行异常或出错

程序执行,可能有两类返回值:

》0:正确执行

》1~255:错误执行。其中1,2,127 是系统预留错误代码,可自行使用

$$:当前所在进程的进程号 【$$变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。】

$!:后台运行的最后一个进程号

$_:在此之前执行命令或脚本的最后一个参数

引号对变量赋值的影响:

》双引号“”:允许通过$符号引用其他变量值

》单引号‘’: 禁止引用其他变量值,$视为普通字符

》反撇号` `:将命令执行的结果变输出给变量 ,

$(…) :这是反撇号的另一种版本。

二.Bash(Bourne-Again Shell)简介

Bash是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh

等等。Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手。

大多数的时候,一个Shell Script通常可以在很多种Shell上使用。

通常而言,shell的功能是从终端或其它输入取得命令行,将其解析为一系列操作指令,调用系统内核或相应的

外部程序执行,然后将执行结果返回给终端或其它输出。因此,实现一个简单的shell是一项容易的工作。

但bash的功能不仅限于此,它支持用管道和重定向协同执行命令,提供了强大的脚本编程能力,

具备作业管理功能。一般的Linux发行版中,bash的可执行文件往往是/bin中最大的几个实用程序之一,

客观反映了它的复杂性。

三.Bash实现原理简介

bash使用GNU Readline库处理用户命令输入,Readline提供类似于vi或emacs的行编辑功能。

bash运行时的调度中心是其主控循环。主控循环的功能较为简单,它循环读取用户(或脚本)输入,传递给

语法分析器,同时处理下层递归返回的错误。

语法分析器对文本形式的输入首先进行通配符、别名、算术和变量展开等工作,然后通过命令生成器得到

规范的命令结构,并由专门的重定向处理机制填写重定向语义,交由命令执行器执行。命令执行器依据

命令种类不同,执行内部命令函数、外部程序或文件系统调用。在命令执行过程中,执行器要对系统信号

进行捕获和处理。在支持作业管理的操作系统中,命令执行器将进程信息加入作业控制机制,并允许用户

使用内部命令或键盘信号来启停作业。如果在不支持作业管理的操作系统中编译bash,会使用另一套接口

相同的机制对进程信息进行简单的维护。

四.Shell和环境变量的关系

环境变量是和Shell紧密相关的,环境变量是通过Shell命令来设置的。用户登录系统后就启动了一个Shell。

对于Linux来说一般是bash,但也可以重新设定或切换到其它的 Shell。

设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,可以通过

变量名来访问相应的环境变量。

Linux 的环境变量具有继承性,即子shell 会继承父shell 的环境变量。

当前shell中的变量也叫本地变量,很显然本地变量中肯定包含环境变量。Linux 的本地变量的非环境变量

不具备继承性。

五、登录脚本的执行顺序:【注:仅适用于 bash shell】

Login Shell

是指登录时,需要提供用户名密码的shell,如:su – user1 , 图形登录, ctrl+alt+F2-6进入的登录界面。

这种Login shell 执行脚本的顺序:

1. /etc/profile 【全局profile文件;它定义了LoginUser的 PATH, USER, LOGNAME(登录使用者帐号)】

2. /etc/profile.d/目录下的脚本

3. ~/.bash_profile 【搜索命令的路径 ——————- 登录级别 环境变量配置文件 】

4. ~/.bashrc 【存储用户设定的别名和函数 ———- shell级别 环境变量配置文件】

5. /etc/bashrc 【全局bashrc文件; 它主要定义一些 Function 和 Alias;更改/etc/bashrc会影响到所有用户,由root用户管理。】

Non-Login shell

非登录shell指的是,不需要输入用户名密码的shell,如图形下 右键terminal,或ctrl+shift+T打开的shell

这种Non-Login shell 执行登录脚本的顺序:

1. ~/.bashrc

2. /etc/bashrc

3. /etc/profile.d/目录下的脚本

说到用户脚本就不能不说下,与用户密切相关的两个文件:

1. /etc/login.defs —– 它定义了用户密码长度,最长使用期,警告天数,密码加密方法,家目录默认权限 等。

2. /etc/default/useradd –它定义了创建用户时,默认家目录的根,默认shell,从哪里拷贝必要配置文件,是否创建邮箱等。

/etc/skel –【.bashrc, .bash_profile, .bash_logout等文件都源自这里】

当用命令添加一个用户时,它默认会在/home/下新建一个以用户名为名的目录,并把/etc/skel下的文件

copy到这个新用户的家目录中。这样当该用户登录时,系统会自动调用这些文件,配置该用户的登录环境。

六. 环境变量的应用 操作:

1.变量内容的删除和替换

${变量#关键词} 从头开始检查关键词,将符合的最短数据删除

${变量##关键词} 从头开始检查关键词,将符合的最长数据删除

${变量%关键词} 从尾开始检查关键词,将符合的最短数据删除

${变量%%关键词} 从尾开始检查关键词,将符合的最长数据删除

${变量/旧字符串/新字符串} 若符合旧字符串,则第一个旧字符串被替换

${变量//旧字符串/新字符串} 若符合旧字符串,则全部旧字符串被替换

2. 变量内容的设定和替换

一次变量置换:

变量没有值:

echo ${a:=abc} //若a没有值,就送给a一个abc,作为它的值,这时a的值就永久是abc了,直到下次修改。

//下面例子不常用

echo ${a:?必须需要给变量一个值} //若a没有值,则提示"必须需要给变量一个值"

echo ${a:-abc} //若a没有值,就借给a一个值,次命令执行完后,a还是空值。

变量有值

echo ${a:+123} //临时替换变量的值; a=1; expr ${a:+123} – 1;其值为122

二次变量置换

示例一:

A=B

a=1

B1="B值"

eval echo \$$A$a > B1.txt //注意:这里不能直接用反撇号获取二次置换的结果。

C=`cat B1.txt` //如此就可以获取B1的变量值了.

示例二:

FAIL="echo -e \"\n\e[31m\${FMSG}\e[0m\n\""

FMSG="需要红色提示显示的字符串。" && eval ${FAIL}

示例三:

grep的结果:"APPDIR="/home/abc/bin“" 通过eval可以直接将APPDIR转换为赋值语句执行。

eval `grep '^ .*APPDIR' /etc/tuxconfig`

echo ${APPDIR} //这样就可以输出APPDIR的值。

七.一些Shell内置命令

1.source命令

作用:在当前bash环境下读取并执行FileName中的命令,使环境变量生效。

注:该命令通常用命令“.”来替代。

例如:

source ~/.bash_profile

2.export :

用于把变量变成当前shell和其子shell的环境变量,存活期是当前的shell及其子shell,因此重新登陆或者关闭当前

shell及其子shell后,它所设定的环境变量就消失了。

3.env和printenv

这两个变量用于打印所有的环境 变量:

4.set

用于显示与设置当前本地 变量。单独一个set 就显示了当前环境的所有的变量,它肯定包括环境变量和一些非环境变量

5.unset 用于清除变量。不管这个变量是环境变量还是本地变量,它都可以清除。

八.其它与变量相关的小知识

shell : 属于弱类型语言,变量可直接使用,不需要声明和初始化。

对于强类型语言,则必须在使用变量前先声明,甚至需要初始化,因为变量不初始化其值为随机数。

变量: 它是内存空间的一个别名,这个别名映射的是内存的存储单元的编址。

数组:是一个命名的连续的内存空间

Shell的变量类型: 是事先确定数据的存储格式和长度。

字符: 是按照ASCII存储;一个字符串10,是存储为两个ASCII码,占16bit。

数值:

1.整型: 如10,它存储时,是转为二进制1010,占4bit,实际占8bit.

2.浮点型: “11.23”,它在存储时,是会转为两部分存放,

一般为数值和小数点位置,如11.23–>0.1123*10^2,存储时仅存1123和次方数2.

如:2014/11/11在存放时,它是若按字符串存64bit.

如按数值存则采用2014/11/11 – 1977/1/1 = N, 它若存N这个数值,需要的空间最多24bit.

变量溢出:

一个整型是8bit,可存放的值有256个,范围是0-255,但若一个整型中存放了256,最怎样?结果就是变量溢出,

8bit中存的是全0,1溢出了,溢出之后1被存放到其它程序的存储空间中了,它可能覆盖其它程序的数据。

这看上去没有任何意义,但若是一个设计精良的溢出值,则可能会因此覆盖掉某些程序的一部分内存空间

从而轻易的获取该程序的控制权,若该程序是系统进程,则它将可能获取系统权限

shell中数组相关操作: —【注:shell中的数组不能做为export导出的对象,因此它仅不能作为环境变量】

变量名=(Value1 Value2 Value3 Value4)

a=(1 2 3 4 5)

例子:

Cpu(s): 1.0%us, 0.5%sy, 0.0%ni, 98.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

a=(`top -n5 -d1 | awk '$1~/Cpu\(s\):/{print $2}' | awk -F'%' '{print $1}' | xargs -n5`)

查数组成员数

echo ${#a[*]} —>前面加“#”,表示查看数组有多少个成员

查看成员值

echo ${a[0]} —>第一个数组成员的值为 1.

echo ${a[*]} 或 echo ${a[@]} —>查看所以成员的值

declare -p a —>查看所有数组成员。

echo ${a[*]:1:3} —>查看数组中下标为1~3的成员值

[转帖]linux bash环境变量简单总结的更多相关文章

  1. linux bash环境变量简单总结

    来源链接:http://www.178linux.com/8005 原创文章,如有转载,请注明原文地址 一.环境变量简介 Linux是一个多用户的操作系统.每个用户登录系统后,都会有一个专用的运行环境 ...

  2. 第二十一篇 Linux中的环境变量简单介绍

        环境变量之   PATH 定义解释器搜索用户执行命令的路径 获取PATH变量的值: echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/us ...

  3. Linux中环境变量文件及配置

    Linux中环境变量文件及配置   一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统 ...

  4. Linux中环境变量文件及配置(转载)

    一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...

  5. Linux下环境变量设置 (转)

    Linux下环境变量设置 1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错 ...

  6. Linux中环境变量的设置

    目录 环境变量 Shell定义的环境变量 查看环境变量 Linux下环境变量的设置 环境变量 在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软 ...

  7. Linux SHELL,环境变量

    SHELL: 在计算机科学中,Shell俗称壳(用来区别于核),是指"提供使用者使用界面"的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命 ...

  8. Linux设置环境变量小结:设置永久变量&临时变量 全局变量&局部变量

    1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁 ...

  9. Linux:环境变量

    环境变量 变量 变量定义:declare tmp,declare是可选的. 变量赋值:tmp=1,=号左右不要有空格. 变量引用:echo $tmp,不要忘记了$号. 环境变量 简单理解了变量的概念, ...

随机推荐

  1. (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作

    二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...

  2. vim命令整理

    最近使用vim比较多,整理一下!

  3. windows7上启动jmeter报错,寻求解决办法?

    背景: 已安装jdk 12,已配置环境变量,点击jmeter.bat 或者进入cmd启动jmter都无法启动 如图: 情况1.在cmd模式下报错 情况2: 打开运行,输入“powershell ise ...

  4. Python怎么测试异步接口

    当业务处理比较耗时时, 接口一般会采用异步处理的方式, 这种异步处理的方式又叫Future模式. 一般流程 当你请求一个异步接口,接口会立刻返回你一个结果告诉你已经开始处理,结果中一般会包含一个任务i ...

  5. Mysql 生成指定时间段内的所有日期

    DELIMITER $$ DROP PROCEDURE IF EXISTS create_calendar $$ CREATE PROCEDURE create_calendar (s_date DA ...

  6. 【Oracle/Java】向三张表各插入百万数据,共用时18分3秒,平均每张表6分钟

    三张表DDL如下: CREATE TABLE tb01 ( "ID" ,) not null primary key, "NAME" NVARCHAR2() n ...

  7. SQL-W3School-函数:SQL HAVING 子句

    ylbtech-SQL-W3School-函数:SQL HAVING 子句 1.返回顶部 1. HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使 ...

  8. 011-多线程-JUC集合-Queue-PriorityBlockingQueue和DelayQueue

    一.PriorityBlockingQueue简介 PriorityBlockingQueue是一个支持优先级的无界阻塞队列.默认情况下元素采用自然顺序升序排列.也可以自定义类实现compareTo( ...

  9. 一百四十七:CMS系统之celery实现邮件和短信异步发送

    celery工作原理 celery官方文档:https://docs.celeryproject.org/en/latest/ 安装:pip install celery windows下还需安装ev ...

  10. 123457123456#0#-----com.twoapp.jingPinYinYu01----儿童学英语jiemei

    com.twoapp.jingPinYinYu01----儿童学英语jiemei