1.4 Shell的变量
1.4.1什么是变量
变量可以分为两类:环境变量(全局变量)和普通变量(局部变量)
环境变量也可称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程shell中使用,环境变量又可分为自定义环境变量和Bash内置的环境变量
普通变量也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的。
特殊变量:位置变量和进程变量
1.4.2环境变量
使用env/declare/set/export -p命令查看系统中的环境变量,这三个命令的的输出方式稍有不同。
[root@kai scripts]#env
XDG_SESSION_ID=1
HOSTNAME=kai
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.0.1 5537 22
SSH_TTY=/dev/pts/
USER=root
~~~
输出一个系统中的环境变量
[root@kai ~]#echo $LANG
zh_CN.UTF-8
echo $_的作用和Esc+.一样:取出上条命令的最后一个参数
1.4.3普通变量
本地变量在用户当前的Shell生存期的脚本中使用。例如,本地变量OLDBOY取值为bingbing,这个值在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,本地变量值将无效
定义普通变量实践
[root@kai ~]#a=1
[root@kai ~]#b='2'
[root@kai ~]#c="3"
[root@kai ~]#echo "$a"
1
[root@kai~]#echo "$b"
2
[root@kai~]#echo "$"
提示:$变量名表示输出变量,可以用$c和$两种用法
小结:连续普通字符串内容赋值给变量,不管用什么引号或者不用引号,它的内容是什么,打印变量就输出什么
1.4.4 export命令
[root@kai ~]#help export
export: export [-fn] [名称[=值] ...] 或 export -p
为 shell 变量设定导出属性。
标记每个 NAME 名称为自动导出到后续命令执行的环境。如果提供了 VALUE
则导出前将 VALUE 作为赋值。
export命令的说明
当前shell窗口及子shell窗口生效
在新开的shell窗口不会生效,生效需要写入配置文件
#定义变量
[root@kai scripts]#KAI=kai
[root@kai scripts]#export KAI1=1
#当前窗口查看
[root@kai scripts]#echo $KAI
[root@kai scripts]#echo $KAI1
1
#编写测试脚本
[root@kai scripts]#vim quanju.sh
#!/bin/bash
echo$KAI
echo $KAI1
#使用sh执行
[root@kai scripts]#sh quanju.sh
1
#使用source执行
[root@kai scripts]#source quanju.shkai
1
#删除环境变量
unset KAI
1.4.5环境变量相关配置文件
/etc/proflie
/etc/bashrc
~/.bashrc
~/.bash_profile
/etc/proflie.d/ #目录
四文件读取顺序(CentOS6和7都一样)
①/etc/profile
②~/.bash_profile
③~/.bashrc
④/etc/bashrc
文件读取过程示意图
验证四文件读取顺序的方法
sed -i'1a echo "$(date +%T-%s) /etc/profile1" >>/tmp/kai'/etc/profile
sed-i'$a echo "$(date +%T-%s) /etc/profile2" >>/tmp/kai'/etc/profile
sed-i'1a echo "$(date +%T-%s) /etc/bashrc1" >>/tmp/kai'/etc/bashrc
sed-i'$a echo "$(date +%T-%s) /etc/bashrc2" >>/tmp/kai'/etc/bashrc
sed-i'1a echo "$(date +%T-%s) ~/.bashrc1" >>/tmp/kai'~/.bashrc
sed-i'$a echo "$(date +%T-%s) ~/.bashrc2" >>/tmp/kai'~/.bashrc
sed-i'1a echo "$(date +%T-%s) ~/.bash_profile1" >>/tmp/kai'~/.bash_profile
sed-i'$a echo "$(date +%T-%s) ~/.bash_profile2" >>/tmp/kai'~/.bash_profile
1.4.6环境变量的知识小结
ü变量名通常要大写。
ü变量可以在自身的Shell及子Shell中使用。
ü常用export来定义环境变量。
ü执行env默认可以显示所有的环境变量名称及对应的值。
ü输出时用“$变量名”,取消时用“unset变量名”。
ü书写crond定时任务时要注意,脚本要用到的环境变量最好先在所执行的Shell脚本中重新定义。
定时任务的脚本加上 source /etc/profile 防止执行失败的情况
ü如果希望环境变量永久生效,则可以将其放在用户环境变量文件或全局环境变量文件里。
1.4.7变量中引号的使用
只有在变量的值中有空格的时候,会使用引号。
单引号与双引号的区别在于,是否能够解析特殊符号。
echo $(ls $(pwd)) 推荐,支持嵌套
echo `ls `pwd`` 不支持嵌套
[root@kai ~]#name=znix
[root@kai ~]#name2='kai'
[root@kai ~]#echo $nameznix
[root@kai~]#echo $name2kai
[root@kai~]#echo $name3
[root@kai~]#name4='ka i'
[root@kai ~]#echo $name4
kai
[root@kai~]#name5="ka i"
[root@kai ~]#echo $name5
kai
[root@kai~]#name6='ka i $PWD'
[root@kai ~]#echo $name6
ka i $PWD
[root@kai~]#name6="ka i $PWD"
[root@kai ~]#echo $name6
ka i /ro
1.4.8普通变量的要求
1)内容是纯数字、简单的连续字符(内容中不带任何空格)时,定义时可以不加任何引号,例如:
a.kaiAge=22
b.NETWORKING=yes
2)没有特殊情况时,字符串一律用双引号定义赋值,特别是多个字符串中间有空格时,例如:
a.NFSD_MODULE="no load"
b.MyName="Oldboy is a handsome boy."
3)当变量里的内容需要原样输出时,要用单引号(M),这样的需求极少,例如:
a.OLDBOY_NAME='OLDBOY'
变量使用反引号赋值
[root@kai scripts]#time=`date`
[root@kai scripts]#echo $time
2017年 12月 05日 星期二 09:02:06CST
[root@kai scripts]#file=`ls`
[root@kai scripts]#echo $file
kai_test.sh panduan.sh quanju.sh yhk.sh
使用${}
打印变量的时候防止出现“金庸新著”的问题
[root@kai scripts]#time=`date`
[root@kai scripts]#echo $time_day
[root@kai scripts]#echo $_day
2017年 12月 05日 星期二 09:02:06CST_day
[root@kai scripts]#echo $time-day
2017年 12月 05日 星期二 09:02:06 CST-day
编写脚本测试${}
#使用脚本测试
[root@kai scripts]#vim bianliang.sh
#!/bin/bash
#############################################################
#File Name: bianliang.sh
#Version: V1.0
#Author: kai
#Created Time : 2017-12-05 09:10:29
#Description:
#############################################################
time=`date`
echo $timeday
echo $day
[root@kai scripts]#sh bianliang.sh
2017年 12月 05日 星期二 09:11:19 CSTday
1.4.9定义变量名技巧
1.变量名只能为字母、数字或下划线,只能以字母或下划线开头。
2.变量名的定义要有一定的规范,并且要见名知意。
示例:
kaiAge=22 #
kai_age=22 #
kaiAgeSex=man #
kaiAGE=22 #
3.一般的变量定义、赋值常用双引号;简单连续的字符串可以不加引号;希望原样输出时使用单引号。
4.希望变量的内容是命令的解析结果时,要用反引号'',或者用$()把命令括起来再赋值。
1.5特殊变量
1.5.1位置变量
常用的特殊位置参数说明
$0,$1.$2 ~参数实践
[root@kai scripts]#vim chanshu.sh
#!/bin/bash
#############################################################
#File Name: chanshu.sh
#Version: V1.0
#Author: kai
#Created Time : 2017-12-05 09:39:16
#Description:
#############################################################
echo $0
echo"第一个参数:"$1
echo"第二个参数:"$2
echo"第11个参数:"$
第一个参数:
第二个参数:
第11个参数:
[root@kai scripts]#sh chanshu.sh 1 2 3 4 5 6 7 8 9 10 11chanshu.sh
第一个参数:1
第二个参数:2
第11个参数:11
$#参数实践
[root@kai scripts]#vim chanshu.sh
#############################################################
#File Name: chanshu.sh
#Version: V1.0
#Author: kai
#Created Time : 2017-12-05 09:39:16
#Description:
#############################################################
echo $0
echo"第一个参数:"$1
echo"第二个参数:"$2
echo"第10个参数:"$
echo"第11个参数:"$
echo"参数个数:"$#
[root@kai scripts]#sh chanshu.sh 55 2 3 4 5 6 7 8 9 10 11 112chanshu.sh
第一个参数:55
第二个参数:2
第10个参数:10
第11个参数:11
参数个数:12
$*参数实践
[root@kai scripts]#vim chanshu.sh
#############################################################
#File Name: chanshu.sh
#Version: V1.0
#Author: kai
#Created Time : 2017-12-05 09:39:16
#Description:
#############################################################
echo $0
echo"第一个参数:"$1
echo"第二个参数:"$2
echo"第10个参数:"$
echo"第11个参数:"$
echo"参数个数:"$#
echo"参数:"$*
"chanshu.sh"18L, 456C 已写入
[root@kai scripts]#sh chanshu.sh 55 2 3 4 5 6 7 8 9 10 11 112chanshu.sh
第一个参数:55
第二个参数:2
第10个参数:10
第11个参数:11
参数个数:12
参数:55 2 3 4 5 6 7 8 9 10 11 112
$*与$@对比实践
[root@kai scripts]#set -- "I am" handsome boy..
[root@kai scripts]#echo $1
I am
[root@kai scripts]#echo $2
handsome
[root@kai scripts]#echo $3
boy..
[root@kai scripts]#echo $*
I am handsome boy..
[root@kai scripts]#echo $@
I am handsome boy..
[root@kai scripts]#for i in $*;do echo $i ;done
I
am
handsome
boy..
[root@kai scripts]#for i in $@;do echo $i ;done
I
am
handsome
boy..
[root@kai scripts]#for i in "$@";do echo $i ;done
I am
handsome
boy..
[root@kai scripts]#for i in "$*";do echo $i ;done
I am handsome boy..
1.5.2进程状态变量
Shell进程的特殊状态变量说明
进程参数实践
[root@kai scripts]#echo $?
[root@kai scripts]#echo $$
1368
[root@kai scripts]#echo $!
[root@kai scripts]#echo $_
echo
1.5.3 echo参数说明
领取专属 10元无门槛券
私享最新 技术干货