变量必不可少,是任何编程语言之中都存在的,用于存放各种数据,因为shell是个弱语言,所以直接赋值就可以了,每一个变量都是字符串的类型,当然,还有一些变量会被shell环境或者操作系统环境用来存储一些特定的值,这就是环境变量

对于一个进程来说,获取其运行时候的环境变量可以使用下面的命令来查看

cat/proc/$PID/environ

将$PID替换为具体进程即可使用

对于进程的PID获取,可以使用pgrep的命令加上名字来获取到对应的进程ID

pgrep tss

1402

然后获取对应的环境变量就是如下的命令

cat /proc/1402/environ

在获取到的字符串中,其实是一个列表,每一个变量是以name=value的方式来描述的,彼此使用null字符串来分割

所以可以替换对应的字符串

我们可以使用 \n 来替换\0 从而格式化输出,使得variable = value 每行只显示一个

对应的命令可以如下

$cat /proc/1402/environ | tr ‘\0’ ‘\n’

输出格式如下

pgrep: only one pattern can be provided

Try `pgrep –help’ for more information.

[locker@deploy tmp]$ cat /proc/1402/environ | tr ‘\0’ ‘\n’

XDG_SESSION_ID=245

HOSTNAME=deploy

SELINUX_ROLE_REQUESTED=

TERM=xterm

SHELL=/bin/bash

HISTSIZE=1000

SSH_CLIENT=192.168.103.179 51435 22

SELINUX_USE_CURRENT_RANGE=

SSH_TTY=/dev/pts/10

QT_GRAPHICSSYSTEM_CHECKED=1

USER=locker

LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:

HBASE_HOME=/usr/local/hbase

MAVEN_HOME=/usr/local/maven

MAIL=/var/spool/mail/locker

PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/local/jdk/bin:/usr/local/maven/bin:/usr/local/node/bin:/usr/local/hbase/bin:/usr/local/jdk/bin:/usr/local/maven/bin:/usr/local/node/bin:/usr/local/hbase/bin:/home/locker/.local/bin:/home/locker/bin:/usr/local/jdk/bin:/usr/local/maven/bin:/usr/local/node/bin:/usr/local/hbase/bin

PWD=/app/2.0/prod/tss

JAVA_HOME=/usr/local/jdk

LANG=en_US.UTF-8

SELINUX_LEVEL_REQUESTED=

HISTCONTROL=ignoredups

SHLVL=3

HOME=/home/locker

LOGNAME=locker

CLASSPATH=.

XDG_DATA_DIRS=/home/locker/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share

SSH_CONNECTION=192.168.103.179 51435 192.168.103.194 22

LESSOPEN=||/usr/bin/lesspipe.sh %s

XDG_RUNTIME_DIR=/run/user/1000

DISPLAY=localhost:12.0

NODE_HOME=/usr/local/node

_=/usr/bin/nohup

[locker@deploy tmp]$ pgrep tss| cat /proc/$PID/environ

cat: /proc//environ: No such file or directory

[locker@deploy tmp]$ cat /proc/|pgrep tss|/environ

-bash: /environ: No such file or directory

接下来就是实战演练了

一个变量的赋值方式

var=value

var是变量的名字,value是赋给变量的值,如果value不包含任何空白的字符,那么不需要使用任何引号就可以直接的引用

反之,就必须使用单引号或者双引号

对了,使用赋值变量的时候不能加上空格 var = value就不行,因为这是判断等于的方式

使用变量的时候,可以直接使用 $变量名的方式,来打印出变量的内容

比如,如下的使用方式

var=”value” #赋值操作

echo $var

或者更加的直接

echo ${var}

都会获得对应的输出结果

value

甚至可以在打印的字符串中使用变量

有些环境变量也可以直接使用,比如环境变量HTTP_PROXY,这个虽然没有在本脚本中明确定义

但是是一个全局环境,于是在任何地方都可以继承得到

于是使用起来很简单

我们拿另一个全局变量来举例

$PATH

在脚本中使用$echo $PATH

图片

这样就可以获取所包含的目录列表,所有的环境变量了

其次,还有一些

诸如,HOME PWD USER UID SHELL等环境变量

然后是一些的使用技巧

比如,可以获取到字符串的长度

比如${#var}

获取到字符串长度

图片

识别当前的shell版本

echo $SHELL

echo $0

获得当前是否是超级用户,并且根据此做不同的回应

图片

if 判断后面必须加上 then

结束必须加上fi

发表评论

邮箱地址不会被公开。 必填项已用*标注