Loading

shell脚本学习总结05--变量与环境变量

bash中一切变量都是以字符串的形式存储,env命令可以查看与此终端进程相关的环境变量。

man bash

查看一个进程的环境变量

1.获得程序的PID,例如Java
# pgrep java
23492


2.查看对应的环境变量
# cat /proc/23492/environ


3.将输出格式化,这样查看会比上图清晰
# cat /proc/23492/environ |tr '\0' '\n'
“^@”将变换成换行符


变量赋值
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

      $_ 获取之前命令或脚本的最后一个参数

     !$ 执行上一个命令  

posted @ 2016-08-05 00:30  头痛不头痛  阅读(676)  评论(0编辑  收藏  举报