SHELL变量
一. 类型:环境变量(全局变量)和局部变量
环境变量用于定义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
输出为空
结论:变量没定义就用”-“后面的值代替
努力生活,融于自然