shell 编程(二):环境变量(全局变量)、局部变量

shell变量类型:环境变量(全局变量)、局部变量

  环境变量可以在命令行中设置,但用户退出时这些变量值会丢失,因此最好在用户 家目录下的.bash_profile文件中或者全局配置/etc/profile文件中定义。

将环境变量放入profile文件中,每次用户登录时这些变量值都将被初始化。

  传统上,所有环境变量均为大写;环境变量应用于用户进程前,必须用export命令导出。

//自定义环境变量

[root@bogon shell]# echo $NAME

[root@bogon shell]# export NAME=oldboy
[root@bogon shell]# echo $NAME
oldboy
[root@bogon shell]# declare -x NAME=oldboy
[root@bogon shell]# echo $NAME
oldboy
[root@bogon shell]# NAME=oldboy;export NAME
[root@bogon shell]# echo $NAME
oldboy

[centos@localhost ~]$ export OLDBOY='oldboy'
[centos@localhost ~]$ echo $OLDBOY
oldboy
[centos@localhost ~]$ OLD='oldboy'
[centos@localhost ~]$ export OLD
[centos@localhost ~]$ echo $OLD
oldboy

[centos@localhost ~]$exit

[root@localhost ~]# su - centos
[centos@localhost ~]$ echo $OLD

[centos@localhost ~]$ echo $OLDBOY

[centos@localhost ~]$  //显示,没有了!

只有当前用户要永久生效,解决如下:

root用户下不起作用,要永久生效(包括在其他用户),解决如下:

其他诸如:

  自定义环境变量生产环境java环境配置实例etc.

 

//显示与取消 环境变量

[centos@localhost ~]$ echo $HOME
/home/centos
[centos@localhost ~]$ echo $UID
500
[centos@localhost ~]$ echo $PWD
/home/centos
[centos@localhost ~]$ echo $SHELL
/bin/bash
[centos@localhost ~]$ echo $USER
centos
[centos@localhost ~]$

 

[root@localhost shell]# echo $HOME
/root
[root@localhost shell]# echo $UID
0
[root@localhost shell]# echo $PWD
/root/shell
[root@localhost shell]# echo $SHELL
/bin/bash
[root@localhost shell]# echo $USER
root
[root@localhost shell]#

 

[root@localhost ~]# env      //查看所有系统默认的环境变量

[root@localhost ~]# set

[root@localhost ~]# unset USER  //unset消除本地变量和环境变量
[root@localhost ~]# echo $USER

[root@localhost ~]# 

 

局部变量

  定义本地变量时在用户当前的shell生存期的脚本中使用。例如本地变量OLDBOY取值为ett098,这个值只在用户当前shell生存期中有意义。如果在shell中启动另一个进程或者退出,本地变量OLDBOY值将无效。

//定义普通字符串变量

注意:$a 等价于 ${a}

[root@localhost ~]# a=192.168.1.2
[root@localhost ~]# b='192.168.1.2'
[root@localhost ~]# c="192.168.1.2"
[root@localhost ~]# echo $a
192.168.1.2
[root@localhost ~]# echo $b
192.168.1.2
[root@localhost ~]# echo $c
192.168.1.2
[root@localhost ~]# echo "a=${a}"
a=192.168.1.2
[root@localhost ~]# echo "b=${b}"
b=192.168.1.2
[root@localhost ~]# echo "c=${c}"
c=192.168.1.2

 

[root@localhost ~]# a=192.168.1.2-$a
[root@localhost ~]# b='192.168.1.2-$a'
[root@localhost ~]# c="192.168.1.2-$a"
[root@localhost ~]# echo $a
192.168.1.2-192.168.1.2
[root@localhost ~]# echo $b  //?!
192.168.1.2-$a
[root@localhost ~]# echo $c
192.168.1.2-192.168.1.2-192.168.1.2
[root@localhost ~]#

单引号‘’:里面内容原样输出,即所见即所得;

双引号“”:里面内容输出,若内容中有命令、变量等会先把其解析出来再输出最终内容;

无引号 :把内容输出来,若内容中有命令、变量等会先把其解析出来再输出最终内容;若字符串中带有空格等特殊字符,则不能完整输出,需要改加双引号。一般连续的字符串、数字、路径等可以不加任何引号,不过最好用双引号替代之。

[root@localhost ~]# date
2017年 07月 12日 星期三 18:30:06 CST
[root@localhost ~]# echo date
date
[root@localhost ~]# echo 'date'
date
[root@localhost ~]# echo "date"
date
[root@localhost ~]# echo '`date`'
`date`
[root@localhost ~]# echo "`date`"
2017年 07月 12日 星期三 18:32:08 CST
[root@localhost ~]# echo `date`
2017年 07月 12日 星期三 18:32:15 CST
[root@localhost ~]#

 

[root@localhost ~]# OLDBOY=testchars  //变量定义后调用测试
[root@localhost ~]# echo $OLDBOY
testchars
[root@localhost ~]# echo '$OLDBOY'
$OLDBOY
[root@localhost ~]# echo "$OLDBOY"
testchars
[root@localhost ~]# OLDBOY=test chars
-bash: chars: command not found
[root@localhost ~]# OLDBOY="test chars"
[root@localhost ~]# echo $OLDBOY
test chars
[root@localhost ~]# echo '$OLDBOY'
$OLDBOY
[root@localhost ~]# echo "$OLDBOY"
test chars

 

特殊例子:awk调用shell变量引号例子,与以上结论相反,需注意!!!

[root@localhost ~]# ETT=123 
[root@localhost ~]# awk 'BEGIN {print '$ETT'}'
123
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]#

[root@localhost ~]# ETT='abc'
[root@localhost ~]# awk 'BEGIN {print '$ETT'}'

[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]# awk 'BEGIN {print "'$ETT'"}'
abc
[root@localhost ~]# awk 'BEGIN {print '"$ETT"'}'

[root@localhost ~]#

自定义变量的建议:

a.纯数字(不带空格),定义方式可以不加引号(单或双);

[root@localhost ~]# OldboyAge=33
[root@localhost ~]# NETWORKING=yes

b.没特殊情况,字符串一般用双引号定义,特别是多个字符串中间有空格时;

[root@localhost ~]# NFSD_MODULE="no load"
[root@localhost ~]# MyName="oldboy is a handsome boy!"
-bash: !": event not found
[root@localhost ~]# MyName="oldboy is a handsome boy."

c.变量内容需要原样输出时,要用单引号。

[root@localhost ~]# OLDBOY_NAME='OLDBOY'

变量的命名规范:

1、变量命名要统一,使用大写字母,最好以${APACHE_ERR_NUM} 或者"${APACHE_ERR_NUM}"方式引用变量;

2、避免无含义的字符或者数字;

3、脚本中的全局变量定义,例如:TEXTDOMAIN=initscripts ;在变量使用时使用{}将变量括起来或者“${OLDBOY_HOME}”

4、脚本中的局部变量定义,存在于脚本函数function中的变量为局部变量,要以local方式进行声明。使之在函数作用域内有效,防止变量在函数中的命名与变量外部程序中变量重名造成程序异常。

[root@localhost ~]# less /etc/init.d/functions   //多模仿学习该函数库脚本定义思路!!!

# Check if any of $pid (could be plural) are running
checkpid() {
local i

for i in $* ; do
[ -d "/proc/$i" ] && return 0
done
return 1
}

5、变量合并:当某些变量或者配置项要组合起来才有意义时,如文件的路径和文件名称,建议将要组合的变量合并到一起赋值给一个新的变量,这样既方便之后的调用,也为以后进行修改提供了方便。

[root@localhost shell]# cat > testsource.sh
VERSION="2.2.22"
SOFTWARE_NAME="httpd"
SOFTWARE_FULLNAME="${SOFTWARE_NAME}-${VERSION}.tar.gz"
[root@localhost shell]# cat testsource.sh
VERSION="2.2.22"
SOFTWARE_NAME="httpd"
SOFTWARE_FULLNAME="${SOFTWARE_NAME}-${VERSION}.tar.gz"

[root@localhost shell]# . testsource.sh
[root@localhost shell]# echo $SOFTWARE_FULLNAME
httpd-2.2.22.tar.gz

 

//把一个命令作为变量,两种方式:

[root@localhost shell]# CMD=`ls`   //第一种
[root@localhost shell]# echo $CMD  //使用echo可以显示变量的值
test1.sh test2.sh test.sh testsource.sh
[root@localhost shell]#
[root@localhost shell]# CMD1=$(pwd) //第二种
[root@localhost shell]# echo $CMD1
/root/shell

注意:1、${WEEK}day 若变量和其他字符组成新的变量就必须给变量加上大括号{ }

    2、推荐使用${A} 而不是$A,避免出现怪异错误。

[root@localhost shell]# CMD=$(date+%F)
-bash: date+%F: command not found
[root@localhost shell]# CMD=$(date +%F)
[root@localhost shell]# echo $CMD
2017-07-12
[root@localhost shell]# echo $(date +%F).tar.gz
2017-07-12.tar.gz
[root@localhost shell]# echo `date +%F`.tar.gz
2017-07-12.tar.gz
[root@localhost shell]# tar zcvf etc_$(date +%F).tar.gz /etc

[root@localhost shell]# ls
etc_2017-07-12.tar.gz test1.sh test2.sh test.sh testsource.sh

 

posted @ 2017-07-11 22:50  bkycrmn  阅读(558)  评论(0)    收藏  举报