变量必不可少,是任何编程语言之中都存在的,用于存放各种数据,因为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