您的位置:首页 > 运维架构 > Shell

shell脚本编程讲解2

2015-02-14 18:55 239 查看
自定义环境变量(全局变量)
设置环境变量
如果想设置环境变量,就要在给变量赋值之后或设置变量时使用export命令,带-x选项的declare
内置命令也可可以同样完成功能(注意:输出变量时不要在变量名前面加$)
格式:
①export
变量名=value
②变量名=value;export
变量名
③ declare -x
变量名=value
实例:
1.当前生效
exportOLDBOY="oldboy"
echo $OLDBOY
2.对当前用户有效
vi .bash_profile
3.对所有用户都生效
vi /etc/profile
source /etc/profile
或 . ./etc/profile
显示与取消环境变量
通过echo
命令打印环境变量
$HOME用户登陆时进入的目录
 
$UID 当前用户的UID(用户标识)
 
$PWD 当前工作目录的绝对路径名
$SHELL 当前SHELL
$USER当前用户
[oldboy@mode ~]$ echo $HOME
/home/oldboy
[oldboy@mode ~]$ echo $UID
501
[oldboy@mode ~]$ echo $PWD
/home/oldboy
[oldboy@mode ~]$ echo$SHELL
/bin/bash
[oldboy@mode ~]$ echo $USER
oldboy
用env{printenv}或set显示默认的环境变量
[oldboy@mode ~]$
[oldboy@mode ~]$ env
HOSTNAME=mode
SHELL=/bin/bash
TERM=vt100
OLD=old
HISTSIZE=1000
LC_ALL=C
USER=oldboy
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=
01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*
.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.l
zh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31
:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35
:*.png=01;35:*.tif=01;35:
MAIL=/var/spool/mail/oldboy
PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sersync/bin:/usr/local
/mysql/bin:/usr/local/mysql/scripts:/usr/local/mysql:/home/oldboy/bin:/home/oldboy/bi
n
INPUTRC=/etc/inputrc
PWD=/home/oldboy
LANG=en_US.UTF-8
OLDBOY=oldboy
SHLVL=1
HOME=/home/oldboy
LOGNAME=oldboy
CVS_RSH=ssh
LESSOPEN=|/usr/bin/lesspipe.sh%s
G_BROKEN_FILENAMES=1
_=/bin/env
或则set -a
[oldboy@mode ~]$ id -u
501
[oldboy@mode ~]$ echo $UID
501
用unset消除本地变量和环境变量
echo $USER
unset USER
局部变量
定义本地变量
普通字符串变量定义
变量名=value
变量名='value'
变量名=“value”
输出 echo
“a=$a”
或者 echo
“a=${a}”
有关单引号.双引号与不加引号的简要说明如下:
单引号:
        可以说是所见即所得:即将单引号的内容原样输出,或者描述为单引号里面看到底的
是什么,就输出什么
双引号:
把双引号内的内容输出出来;如果内容中有命令,变量等,会先把变量,命令解析出结果,然后
在输出最终内容来
无引号:
    把内容输出出来,会将含有空格的字符串视为一个整体输出,如果内容中有命令。变量
等,会先把变量,命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符
,则不能完整的输出,需要改加双引号,一般连续的字符串,数据,路径等可以用,不过最好用
双引号替代之
 
范例1:经过反引号的‘date’命令测试
[root@mode ~]# echo'`date`'
`date`
[root@mode ~]# echo"`date`"
Sat Feb 14 19:25:29 CST2015
[root@mode ~]# echo `date`
Sat Feb 14 19:25:37 CST2015
对于变量的引用,一个 一个是$,另一个是``
范例2:awk
调用s[root@mode ~]# ETT=123
[root@mode ~]# awk 'BEGIN{print "$ETT"}'
$ETT
[root@mode ~]# awk 'BEGIN{print '$ETT'}'
123
 
自定义变量的建议
(1).
纯数字(不带空格),定义方式可以不加引号(单或双),例如

 a.oldboyage=33
 b.NETWORKING=yes
 2.没有特殊情况,字符串一般用双引号()定义,特别是多个字符创空间有空格时
 a.NFSD_NODULE="no load"
 b.MyName="Oldboy is handsome boy."
 3.变量内容需要原样输出时,要用单引号('')
 a.OLDBOY_NAME='OLDBOY'
变量的命名规范
1)变量命名要统一,使用全部大写字母,多个单词连接使用“_”,引用时,最好以${APACHE}
_ERR_NUM}加大括号或“${APACHE_ERR_NUM}”外面加双引号方式引用变量:
2)避免无含义字符或数字:例如下面的COUNT,并不知道其确切含义
3)全局变量定义,如OLDBOY_HOME或OLDBOYHOME,在变量使用时,使用{}将变括起来
或“${OLDBOY_HOME}”
脚本中局部变量定义:存在于脚本函数(function)中的变量称为局部变量,要以local方式进行
声明,使之之在本函数作用域内有效,防止变量在函数中的命名与变量外部程序中变量重名造成
程序异常,
function TestFunc()
{
local i
for((i=0;i<n;i++))
do
echo 'do something';
done
}
变量合并:当某些变量或配置项要组合起来才有意义时,如文件的路径,和文件名称,建议将要
组合的变量合并到一起赋值给一个新的变量,这样既方便之后的调用,也为以后进行修改提供方
便;
例如:VERSION='2.2.22'
      SOFTWARE_NAME="httpd"
     SOFTWARE_FULLNAME="${SOFTWARE_NAME}-${VERSION}.tar.gz"
把一个命令作为变量
CMD= `ls`wd/
echo $CMD
[root@mode ~]# ls

anaconda-ks.cfg  index.html   install.log         oldboy
grep.log         index.html.1  install.log.syslog
[root@mode ~]# CMD=`ls`
[root@mode ~]# echo $CMD
anaconda-ks.cfg grep.logindex.html index.html.1 install.log install.log.syslog

oldboy 
在变量名前面加$,可以取得此变量的值,使用echo
命令 可以显示变量的值,$A和${A}的写法不
同,但是功能一样,
3${WEEK}day
若变量和其他字符组成新的变量就必须加上大括号{}

4养成将所有字符创变量用双引号括起来的使用的习惯,将会减少很多编程是遇到的奇怪的错误
生产环境常见应用:
1.对站点按天打包生成不同的文件名。
CMD=$(date +%F)
echo $CMD
echo $(date +%F).tar.gz
echo `date +%F`.tar.gz
tar zcvf etc_$(date +%F).tar.gz/etc
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: