概述
变量是任何一种编程语言都必不可少的组成部分,用于存放各类数据。
脚本语言通常不需要在使用变量之前声明其类型。只需要直接赋值就可以了。
在Bash中,每一个变量的值都是字符串。
无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。
有一些特殊的变量会被shell环境和操作系统环境用来存储一些特别的值,这类变量就被称为环境变量。
理论知识
变量采用常见的命名方式进行命名。当应用程序执行时,它接收一组环境变量。
可以使用env命令查看所有与终端相关的环境变量。
代码语言:javascript复制[root@entel1 ~]# env
HOSTNAME=entel1
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
.......省略
对于进程来说,其运行时的环境变量可以使用下面的命令来查看:
代码语言:javascript复制cat /proc/$PID/environ
其中,将PID设置成相关进程的进程ID(PID总是一个整数)。
如何获取$PID呢?
假设有一个叫做gedit的应用程序正在运行。我们可以使用pgrep命令获得gedit的进程ID:
代码语言:javascript复制$ pgrep gedit
12501
那么,你就可以通过以下命令获得与该进程相关的环境变量:
代码语言:javascript复制$ cat /proc/12501/environ
GDM_KEYBOARD_LAYOUT=usGNOME_KEYRING_PID=1560USER=slynuxHOME=/home/slynux
.........
环境变量远不止这些,只是由于对页面篇幅的限制,在这里删除了其他很多环境变量。
pgrep 用法
代码语言:javascript复制[root@entel2 ~]# pgrep --help
pgrep: invalid option -- '-'
Usage: pgrep [-flvx] [-d DELIM] [-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]
[-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] [PATTERN]
- pgrep程序检查在系统的中活动进程,报告进程属性匹配命令行上指定条件的进程的ID。
- pgrep 查找的是程序名,而不包其参数
- pgrep相当于 ps -eo pid,cmd |awk '{print 1,2}'|grep keyword
- pgrep 通常和pkill在一起用,在指定条件下kill进程
如果pgrep不是很熟悉,可以用ps -ef
代码语言:javascript复制[root@entel2 ~]# ps -ef|less
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Oct25 ? 00:00:15 /sbin/init
root 2 0 0 Oct25 ? 00:00:00 [kthreadd]
取 第二列 PID
举例:
代码语言:javascript复制[root@entel2 ~]# pgrep java
4309
代码语言:javascript复制[root@entel2 ~]# cat /proc/4309/environ
APP_XMX_SIZE_zmcDaemon=128MHOSTNAME=tbpr_app1SHELL=/bin/bashTERM=vt100HISTSIZE=1000SSH_CLIENT=172.25.246.66 42562 22OLDPWD=/home/settWeb/zmc_agent/daemonSSH_TTY=/dev/pts/9USER=settWebJRE_HOME=/usr/lib/jvm/jdk1.7.0_80/jreLS_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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.......省略
上面的命令返回一个包含环境变量以及对应变量值的列表。每一个变量以name=value的形式来描述,彼此之间由null字符( )分隔。
看起来是不是很懵逼,一团乱糟糟的很难以查看。
如果你将 替换成n,那么就可以将输出重新格式化,使得每一行显示一组“变量=值”。替换可以使用tr命令来实现:
代码语言:javascript复制[root@entel2 ~]# cat /proc/4309/environ |tr '