首页 > 技术文章 > SHELL变量

regit 2017-12-15 17:38 原文

 
 
 
一. 类型:环境变量(全局变量)和局部变量
 
环境变量用于定义shell的运行环境,保证shell命令的正确执行。环境变量可以在命令行中设置,但重启失效,所以最好定义在用户家目录下的.bash_profile文件中或者全局配置文件/etc/profile,/etc/bashrc;也可以定义在/etc/profile.d中,这样每次用户登录的时候,这些变量都会被初始化。
 
例如,在用户家目录下的.bash_profile文件中定义有如下变量
 
1. 变量$PS1,它表示用户的登录信息
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
其中\u:表示用户名,\h:主机名,\W:初始路径位置,$:使用的解释器。可以在.bash_profile,或者.bash_rc中改一下试试看。
 
2. HISTFILESIZE和HISTSIZE表示历史记录的显示数;
 
3. TMOUT表示不做操作默认时间自动做退出操作,这俩可用来做优化
 
 
 
二. 设置环境变量
 
1. 命令env可用来查看默认的环境变量
unset可以取消环境变量,例如unset PS1取消这个环境变量后,echo $PS1就没内容了,但这个是临时生效的,想永久生效,还是要在配置文件中搞。
/etc/init.d/functions:系统的函数库,没事仔细研究下每一行
 
2. 普通字符串变量定义的方法有三种,变量名没啥要求
1)变量名=value;(简单值就用这个)  
直接定义变量内容,内容一般为简单连续的数字,字符串,路径名等
  
2)变量名='value' ;
通过单引号定义的变量,引号里是什么就输出什么,即使内容中有变量也会把变量名原样输出,不会输出变量值。
 
3)变量名="value"  
适合于字符串中有其他变量的情况,输出变量时引号里的其他变量会输出其值。
 
 
3. 在/etc/profile文件中设置,搞完后记得用source /etc/profile使修改生效
给变量赋值后使用export命令就可以设置环境变量了         例如 export oldboy="i am oldboy"就可以了。#记住这一个方法就好
 
 
4. 把命令定义为变量
例如:cmd=`date +%F`    或者 cmd=$(date +%F)----貌似这种方法好些,注意+和%号之间是没空格的
          调用变量如下:
          echo $cmd 或者 echo ${cmd}
          最好养成习惯用 echo "$cmd" 或者 echo "${cmd}"
 
 
 
三. 特殊变量
 
1. 位置变量,查看系统 more /etc/init.d/tomcat文件加深这几个变量的理解,比如$0 stop就相当于执行/etc/init.d/tomcat stop
 
$0:获取当前执行shell脚本的文件名,包括路径
$n:获取当前执行shell脚本的第n个参数,n=1...9,如果n>9,用大括号括起来,如${10}。 sh n.sh 张三 李四,  $1就等于张三,$2等于李四
       试试seq 9 | sed 's#[0-9]#$&#g'  和 seq -s " " 10 (将空格作为分隔符,依次输出10个数字)
$*:获取当前shell的所有参数,将所有的命令行参数看作一个字符串,相当于“$1$2$3.....” 
$#:获取当前shell命令行中参数的总个数
$@:表示这个shell中的所有参数 "$1" "$2”"$3" ".....",这是将参数传递给其他程序的最佳方式,因为它会保留所有内嵌在每个参数中的任何空白
 
 
2. 进程状态变量
$$ :获取当前shell的进程号(PID)
$! :执行上一个指定的PID
$?:获取执行上一个执行的返回值(0为执行成功,非0为失败),下图例子中[ $RETVAL -eq 0 ]是一个判断语句,后面的&&表示,前面的命令执行成功后接着执行后面的命令

$_   表示在此之前执行的命令或脚本的最后一个参数 

来个例子,脚本如下,然后执行sh all.sh a b c,观察结果。 

 

小技巧
> /dev/null表示把标准输出重定向到/dev/null
>&/dev/null表示把标准和错误输出重定向到/dev/null
 
 
 
 
四. shell变量的子串应用技术实践
 

 

例1. MONKEY="it is a monkey"  ;echo ${#MONKEY}   输出为14
 
例2. 截取MONKEY变量,从字符串的第2个字符之后开始取值,默认取后面全部字符值
echo ${OLDBOY:2}  输出为is a monkey
 
例3. 截取MONKEY变量字符串,从第2个字符之后开始取,并且只取2个字符
echo ${MONKEY:2:2}  输出为is
 
例4. 从变量开头开始,删除最短匹配“it is" 子串
echo ${MONKEY#it is}   输出为a monkey    
注意:#两边不能有空格
 
例5. 从变量开头开始删除最长匹配”it is a“子串
echo ${MONKEY##it is a}    
 
例6. 从变量结尾开始删除最短匹配monkey子串
echo ${MONKEY%monkey}
 
例7. 从变量结尾开始删除最长匹配key子串
echo ${MONKEY%%key}
 
例8. 使用dog代替变量第一个匹配的monkey字符
echo ${MONKEY/monkey/dog}
 
例9. 使用dog代替从变量MONKEY结尾开始匹配的monkey字符串
echo ${MONKEY/%monkey/dog}
 
例10. 使用he is字符串,来代替变量开头匹配的It is 字符串
echo ${MONKEY/#it is/he is}
 
注意:统一规律,#表示从开头开始,%表示从结尾开始
 
 
 
五. shell变量替换技术实战
 

 

例1,${value:-word}    当变量未定义或者值为空时,返回值为word内容,否则返回变量的值

result=${test:-UNSET}; echo $result   输出为UNSET      echo $test 输出为空

结论:当test变量没内容时,就返回后面的UNSET值

 

给test定义一个值,test='math'

result=${test:-UNSET}

echo $result,输出为math

结论:test变量有内容时,就返回test变量的值

 

例2,${value:=word},使用unset清空上面变量的值,使result和test的值都为空,然后做如下操作

result=${test:=UNSET}

echo $result;输出为UNSET,

echo $test;输出为UNSET

test变量为空,则输出word值,并且把word赋值给test,这个变量功能可以解决变量没有定义的问题,确保变量始终有值。

 

给test赋值,test=math

result=${test:=UNSET}

echo $result,输出为math

echo $test,输出为math

test变量存在且非空,则输出test变量

 

 例3. ${value:?"word"}
如果value未定义,echo ${value:?"not defined"}
输出为-bash: value: not defined
 
value=1
echo ${value:?"not defined"}
输出为1
 
此功能可用于捕捉由于变量未定义而导致的错误
 
 
例4,${value:+word}
如果value值存在且非空,那么返回word的值,否则,返回值为空
未定义value时
r=${value:+1}; echo $r    返回值为空
 
定义value,value=apple
echo $r,输出为1
 
此功能用于测试变量是否存在。
 
 
例5.  ${value-word} 去掉冒号的情况
httpd=${HTTPD-/usr/sbin/httpd}
pidfile=${PIDFILE-/var/run/httpd.pid}
echo $httpd $pidfile
输出为/usr/sbin/httpd /var/run/httpd.pid
echo $HTTPD $PIDFILE
输出为空
 
结论:变量没定义就用”-“后面的值代替
 
 
 
 
 

推荐阅读