bash中一切变量都是以字符串的形式存储,env命令可以查看与此终端进程相关的环境变量。
man bash
查看一个进程的环境变量
1.获得程序的PID,例如Java
# pgrep java
23492
2.查看对应的环境变量
# cat /proc/23492/environ
3.将输出格式化,这样查看会比上图清晰
# cat /proc/23492/environ |tr ' ' '
'
“^@”将变换成换行符
变量赋值
var=varlue,如果value不包含空白字符,则不必加单引号或者双引号
var = value 是相等操作,注意区分,很多人这个地方发生混淆
输出变量
echo $var 或者 echo ${var}
例如:
# var=apple # echo "${var}(s)" apple(s)
变量字符串的常用操作
[root@Director ~]# var="hello world" [root@Director ~]# echo ${#var} #计算字符串的长度,类似于"wc -m"-1;expr length "$var" 11 [root@Director ~]# echo ${var:2} #从第二个字符串之后开始取,不包括第二个字符串。 llo world [root@Director ~]# echo ${var:2:2} #从第二个字符串之后开始取,取两个字符,相当于"echo $var|cut -c 3-4" ll [root@Director ~]# echo ${var#hell} #字符串开头删除最短匹配的字符 o world [root@Director ~]# echo ${var%ld} #从结尾开始删除最短匹配的字符 hello wor [root@Director ~]# echo ${var/world/linux} #替换匹配字符,类似 “echo ${var}|sed 's/world/linux/'” hello linux [root@Director ~]# echo ${var/#hello/linux} #前缀匹配,则替换 linux world [root@Director ~]# echo ${var/%world/linux} #后缀匹配,则替换 hello linux
[root@Director test]# echo $gender
[root@Director test]# echo ${gender:-female} #变量未赋值,则定义一个值
female
[root@Director test]# echo $gender
[root@Director test]# echo ${gender:=female} #变量未赋值,则定义一个值,并传递给它
female
[root@Director test]# echo $gender
female
[root@Director test]# echo ${gender-male} #变量未定义,则给予定义,若定义了则取原来的值
male
应用场景:
1.防止$path未定义,而删除了根目录或者root目录
[root@Director /]# find ${path:=/test} -name "*.bak"|xargs rm -rf
2.打印出文件或目录的后缀
[root@Director test]# jarName=app_20160807.jar [root@Director test]# echo ${jarName:((${#jarName}-3))} jar
特殊变量
$PS1 系统默认:PS1="[u@h W]$"
$UID 为0时代表root用户
$TMOUT 终端timeout时间
$0,$* ,$@ , $#
[root@Director sbin]# cat /usr/local/sbin/test.sh #!/bin/bash echo '$0=' $0 #脚本的名称 echo '$1=' $1 #运行脚本的第n个参数 echo '$#=' $# #运行脚本参数的个数 echo '$*=' $* #所有参数当成单个字符串,很少使用 echo '$@=' $@ #所有参数 basename $0 #获取文件名 dirname $0 #获取文件的目录 [root@Director sbin]# sh /usr/local/sbin/test.sh aa bb $0= /usr/local/sbin/test.sh $1= aa $#= 2 $*= aa bb $@= aa bb test.sh /usr/local/sbin
进程状态变量
$? 获取执行上一个命令的返回值(0为成功,其它为失败)
$$ 获取当前shell的PID
$_ 获取之前命令或脚本的最后一个参数
!$ 执行上一个命令