文档章节

Linux环境变量

浮躁的码农
 浮躁的码农
发布于 2015/04/25 15:57
字数 3073
阅读 12
收藏 0
点赞 0
评论 0

1. 用户自定义变量

(1)变量设置规则

① 变量名称可由字母、数字和下划线组成,但不能以数字开头

② 变量的默认类型为字符串类型,如果要对数值运算,则必须指定变量类型为数值型

③ 变量用等号连接值,且等号两侧不能有空格

④ 变量的值如果有空格,需使用单引号或双引号括起

⑤ 变量的值中,可使用"\"转义符;

⑥ 如果需要增加变量的值,可以进行变量值的叠加,不过变量需要用双引号包含,即"$变量名",或者用${变量名}包含

⑦ 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令

⑧ 环境变量名建议大写,便于区分

(2)变量分类

① 用户自定义变量

② 环境变量:主要保存与系统操作环境相关的数据;

③ 位置参数变量:用于向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的;

④ 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量的作用也是固定的。

(3)本地变量

① 变量定义:

[root@localhost ~]# name="ws" [root@localhost ~]# echo "$name" ws

② 变量叠加:

复制代码
[root@localhost ~]# aa=123 [root@localhost ~]# aa="$aa"456 [root@localhost ~]# aa=${aa}789 [root@localhost ~]# echo $aa 123456789
复制代码

③ 变量查看:

复制代码
[root@localhost ~]# set

aa=123456789 colors=/etc/DIR_COLORS

name=ws
复制代码

④ 变量删除

[root@localhost ~]# unset name

2. 环境变量

1)用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和该shell的所有子shell中生效。如果把环境变量写入相应的配置文件中,那么该环境变量就会在所有的shell中生效

父shell中创建子shell,可在当前shell中通过命令bash或csh来创建。可通过pstree命令(功能:确定进程数)来查看父shell与子shell的关系

例:

复制代码
[root@localhost ~]# bash

[root@localhost ~]# pstree

........

sshd───sshd───bash───bash───pstree
复制代码

其中,sshd为远程连接工具,第一个bash为父shell,第二个bash是子shell,退出子shell只需输入命令exit即可。

2)设置环境变量

格式为:export 变量名=变量值

例:

#将age和sex变量设置为环境变量

复制代码
[root@localhost ~]# name=ws

[root@localhost ~]# export age=26 [root@localhost ~]# sex=male

[root@localhost ~]# export sex
复制代码

#然后在当前shell和子shell中进行查看

复制代码
[root@localhost ~]# set

name=ws

age=26 sex=male

[root@localhost ~]# bash

age=26 sex=male
复制代码

3)查询环境变量的命令为:env,删除变量的命令为:unset 变量名

4)系统常见环境变量

① PATH:系统查找命令的路径,系统命令并没有写路径就可执行,如ls,是由于PATH环境变量的作用。因此自己写的脚本拷贝到PATH指定的路径中,无需写路径即可直接执行

例:

复制代码
[root@localhost ~]# env | grep PATH

PATH=/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

#PATH变量叠加

PATH="$PATH":/root/sh
复制代码

② PS1:定义系统提示符的变量

提示符

含义

\d

显示日期,格式为"星期 月 日"

\h

显示简写主机名

\T

显示12小时制时间,格式为"HH:MM:SS"

\A

显示24小时制时间,格式为"HH:MM"

\u

显示当前用户名

\w

显示当前所在路径的完整名称

\W

显示当前所在目录的最后一个目录

\#

执行的第几个命令

\$

提示符,root用户为"#",普通用户为"$"

例:

复制代码
[root@localhost ~]# PS1='[\u@\t \w]\$ ' [root@05:46:29 ~]# PS1='[\u@\h \# \W]\$ ' [root@localhost 12 ~]# PS1='[\u@\h \W]\$ ' [root@localhost ~]#
复制代码

3. 位置参数变量

1)

位置参数变量

作用

$n

n为数字,$0代表命令本身,$1-$9代表第一道第九个参数,十以上的参数需要用大括号包含,如${10}

$*

代表命令行中所有的参数,$*把所有的参数看成一个整体

$@

也代表命令行中所有的参数,不过$@把每个参数区分对待

$#

代表命令行中所有参数的个数

例1:写param.sh脚本

复制代码
[root@localhost sh]# vim param.h

#!/bin/sh echo $0 echo $1 echo $2 echo $3
复制代码

验证$n,向脚本中传递参数

复制代码
[root@localhost sh]# ./param.h 11 12 13 1 2 ./param.h 11 12 13
复制代码

例2:param1.sh脚本

复制代码
[root@localhost sh]# vim param1.h

#!/bin/bash

 

num1=$1 num2=$2 sum=$(( $num1 + $num2 )) echo $sum
复制代码

验证:

[root@localhost sh]# ./param1.sh 1 2 3

例3:写param3.sh

复制代码
[root@localhost tmp]# vim param3.sh #!/bin/bash

 

#使用$#代表所有参数个数 echo "A total of $# parameters" #使用$*代表所有的参数 echo "The parameter is:$*" #使用$@也代表所有参数 echo "The parameter is:$@"
复制代码

验证:

复制代码
[root@localhost tmp]# ./param3.sh 1 2 3 4 5 A total of 5 parameters

The parameter is:1 2 3 4 5 The parameter is:1 2 3 4 5
复制代码

例4:$*与$@的区别

复制代码
[root@localhost sh]# vim param4.sh #!/bin/bash

 

# $*中所有参看成是一个整体,所以for只执行一次 for i in "$*" do echo "The parameter is:$i" done # $@中每个参数都看成是独立的,会循环多次

x=1 for y in "$@" do echo "The parameter $x is:$y" x=$(( $x + 1 )) done
复制代码

验证:

复制代码
[root@localhost sh]# ./param4.sh 1 2 3 4 5 The parameter is:1 2 3 4 5 The parameter 1 is:1 The parameter 2 is:2 The parameter 3 is:3 The parameter 4 is:4 The parameter 5 is:5
复制代码

4. 预定义变量

1)

预定义变量

作用

$?

shell中最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确

$$

当前进程的进程号(PID)

$!

后台运行的最后一个进程的进程号(PID)

逻辑"&&"和"||"可以通过$?来判断是否正确。

例:编写variable.sh脚本

复制代码
[root@localhost sh]# vim variable.sh #!/bin/bash

 

#输出当前进程PID,该PID即为variable.sh脚本执行时,生成的进程的PID echo "The current process is $$" # &可以将命令放入后台 find /root -name hello.sh & echo "The last one Daemon process is $!"
复制代码

验证:

[root@localhost sh]# ./variable.sh The current process is 1617 The last one Daemon process is 1618

2)read:接收键盘的输入,其格式为:

read [选项] [变量名]

其中,-p "提示信息":在等待read输入时,输出提示信息;

-t 秒数:read命令会一直等待用户输入,使用此选项,可指定等待时间;

-n 字符数:read命令只接受指定的字符数;

-s:隐藏输入的数据,适用于机密信息的输入。

例:

复制代码
[root@localhost sh]# vim readtest.sh #!/bin/bash

 

# 提示"请输入姓名"并等待30s,把用户的输入保存入变量

read -t 30 -p "Please input your name:" name echo "name is $name" # 使用-s选项隐藏输入年龄

read -t 30 -s -p "Please enter your age:" age echo -e "\n" echo "age is $age" # 使用-n 1选项只接收一个输入字符就会执行(不用输入回车)

read -n 1 -t 30 -p "Please select your gender [M/F]:" gender echo -e "\n" echo "sex is $gender"
复制代码

验证:

复制代码
[root@localhost sh]# ./readtest.sh Please input your name:ws

name is ws

Please enter your age:

 

age is 26 Please select your gender [M/F]:M

 

sex is M

5. Bash的运算符

(1)数值运算与运算符

1)declare声明变量类型,其格式为:

declare [+/-] [选项] 变量名

其中,"-"选项表示给变量设定类型属性,"+"选项表示取消变量的类型属性,-i选项表示将变量声明为整数型,-x选项表示将变量声明为环境变量,-p选项显示指定变量被声明的类型

例1:

复制代码
# 定义变量aa和bb

[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 # 声明变量cc,并保存aa和bb的和

[root@localhost ~]# declare -i cc="$aa"+"$bb" # 显示cc的类型

[root@localhost ~]# declare -p cc declare -i cc="33" # 取消cc的类型属性

[root@localhost ~]# declare +i cc [root@localhost ~]# declare -p cc declare -- cc="33"
复制代码

例2:expr或let数学运算工具(使用较少)

复制代码
# 给变量aa和bb赋值

[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 # dd为aa和bb的和,且注意"+"左右两侧必须有空格

[root@localhost ~]# dd=$(expr "$aa" + "$bb")

[root@localhost ~]# echo $dd 33
复制代码

例3:"$(( 运算式 ))"或"$[ 运算式 ]"(使用较多)

复制代码
[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 [root@localhost ~]# ee=$(( $aa+$bb ))

[root@localhost ~]# echo $ee 33 [root@localhost ~]# ff=$[ $aa+$bb ]

[root@localhost ~]# echo $ff 33
复制代码

(2)运算符

优先级

运算符

说明

13

-,+

单目负、单目正

12

!,~

逻辑非、按位取反或补码

11

*,/,%

乘、除、取模

10

+,-

加、减

9

<<,>>

按位左移、按位右移

8

<=,>=,<,>

小于等于,大于等于,小于,大于

7

==,!=

等于、不等于

6

&

按位与

5

^

按位异或

4

|

按位或

3

&&

逻辑与

2

||

逻辑或

1

=,+=,-=,*=,/=,%=,

&=,^=,|=,<<=,>>=

赋值、运算且赋值

例:

复制代码
# 虽然乘和除的优先级高于加,但通过小括号可调整运算的优先顺序

[root@localhost ~]# aa=$(( (11+3)*3/2 ))

[root@localhost ~]# echo $aa 21 # 14不能被3整除,余数是2

[root@localhost ~]# bb=$(( 14%3 ))

[root@localhost ~]# echo $bb 2 # 逻辑与运算

[root@localhost ~]# cc=$(( 1&&0 ))

[root@localhost ~]# echo $cc 0
复制代码

(3)变量测试与内容替换

变量置换方式

变量y没有设置

变量y为空值

变量y设置值

x=${y-新值}

x=新值

x为空

x=$y

x=${y:-新值}

x=新值

x=新值

x=$y

x=${y+新值}

x为空

x=新值

x=新值

x=${y:+新值}

x为空

x为空

x=新值

x=${y=新值}

x=新值

y=新值

x为空

y值不变

x=$y

y值不变

x=${y:=新值}

x=新值

y=新值

x=新值

y=新值

x=$y

y值不变

x=${y?新值}

新值输出到标准错误输出(即屏幕)

x为空

x=$y

x=${y:?新值}

新值输出到标准错误输出

新值输出到标准错误输出

x=$y

例:变量测试:x=${y-新值}

复制代码
[root@localhost ~]# x=${y-new}

[root@localhost ~]# echo $x

new

[root@localhost ~]# y="" [root@localhost ~]# x=${y-new}

[root@localhost ~]# echo $x

 

[root@localhost ~]# y=234 [root@localhost ~]# x=${y-new}

[root@localhost ~]# echo $x 234
复制代码

6. 环境变量配置文件

(1)简介

1)source命令--环境变量配置文件的内容需要重新登录才能生效,source命令的作用是让其直接生效,无需重新登录。其格式为:

source 配置文件 或 . 配置文件

注意:.与配置文件中间有空格,且.的作用即为source的作用

2)环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,如:PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量。

系统中的环境变量配置文件主要有:

/etc/profile  ;  /etc/profile.d/*.sh  ;  ~/.bash_profile  ;  ~/.bashrc  ;  /etc/bashrc

(2)作用

环境变量配置文件的先后调用顺序如下图所示:

 

1)/etc/profile的作用有:USER变量;LOGNAME变量;MAIL变量;PATH变量;HOSTNAME变量;HISTSIZE变量;umask;调用/etc/profile.d/*.sh文件;

2)~/.bash_profile的作用: 调用了~/.bashrc文件;在PATH变量后面加入了":$HOME/bin"目录;

3)~/.bashrc的作用:定义默认别名;调用/etc/bashrc;

4)/etc/bashrc的作用:PS1变量;umask变量;PATH变量;调用/etc/profile.d/*sh文件。注意:与/etc/profile不同,/etc/bashrc针对的是没有登录的shell,即不用输入用户名、密码,直接在shell中进行用户切换的情景。

(3)其他配置文件和登录信息

1)注销时生效的环境变量配置文件:~/.bash_logout;

2)其他配置文件:~/bash_history,当系统出现错误时,一个重要的排错手段;

3)shell登陆信息:

对于本地终端欢迎信息:/etc/issue

转义符

作用

\d

显示当前系统日期

\s

显示操作系统名称

\l

显示登录的终端号,比较常用

\m

显示硬件体系结构,如i386,i686等

\n

显示主机名

\o

显示域名

\r

显示内核版本

\t

显示当前系统时间

\u

显示当前登录用户的序列号

Linux本地支持6个本地字符终端,用Alt+F1~F6进行切换,则可通过\l显示当前登录的是哪个终端

注意:/etc/issue只对本地登录有效,对远程登录没有作用

远程终端的欢迎信息:/etc/issue.net,转义符在该文件中不能使用,是否显示此欢迎信息,是由ssh的配置文件(/etc/sshd/sshd_configure)决定的,在该文件中找到"Banner"子串,然后加入"Banner /etc/issue.net"行才能显示。写完之后记得输入service sshd restart命令进行重启ssh服务。

© 著作权归作者所有

共有 人打赏支持
浮躁的码农

浮躁的码农

粉丝 57
博文 609
码字总数 141390
作品 0
松江
程序员

暂无相关文章

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 4分钟前 ⋅ 0

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部