Shell编程有哪些变量?Shell编程常用变量

    /    2019-01-25

1. 什么是变量

变量可以分为两类:环境变量(全局变量)和普通变量(局部变量)

环境变量也可称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程shell中使用,环境变量又可分为自定义环境变量和Bash内置的环境变量

普通变量也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的。

特殊变量

2. 环境变量

使用 env/declare/set/export -p 命令查看系统中的环境变量,这三个命令的的输出方式稍有不同。

[root@oldboy scripts]# env
XDG_SESSION_ID=1
HOSTNAME=oldboy
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.0.1 5537 22
SSH_TTY=/dev/pts/0
USER=root~~~

输出一个系统中的环境变量

[root@oldboy ~]# echo $LANG
zh_CN.UTF-8

3. 普通变量

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

定义普通变量实践

[root@oldboy ~]# a=1
[root@oldboy ~]# b='2'
[root@oldboy ~]# c="3"
[root@oldboy ~]# echo "$a"
1
[root@oldboy ~]# echo "$b"
2
[root@oldboy ~]# echo "${c}"

提示:$变量名表示输出变量,可以用$c和${c}两种用法

小结:连续普通字符串内容赋值给变量,不管用什么引号或者不用引号,它的内容是什么,打印变量就输出什么

4. export命令

[root@oldboy ~]# help export 
export: export [-fn] [名称[=值] ...] 或 export -p
为 shell 变量设定导出属性。

标记每个 NAME 名称为自动导出到后续命令执行的环境。如果提供了,VALUE,则导出前将 VALUE 作为赋值。

export命令的说明

当前shell窗口及子shell窗口生效

在新开的shell窗口不会生效,生效需要写入配置文件

# 定义变量

[root@oldboy scripts]# OLDBOY=oldboy
[root@oldboy scripts]# export OLDBOY1=1

# 当前窗口查看

[root@oldboy scripts]# echo $OLDBOYoldboy
[root@oldboy scripts]# echo $OLDBOY1
1

# 编写测试脚本

[root@oldboy scripts]# vim quanju.sh 
#!/bin/bashecho $OLDBOY
echo $OLDBOY1

# 使用sh执行

[root@oldboy scripts]# sh  quanju.sh 
1

# 使用source 执行

[root@oldboy scripts]# source quanju.sh oldboy1

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/oldboy' /etc/profile
sed -i '$a echo "$(date +%T-%s) /etc/profile2" >>/tmp/oldboy' /etc/profile
sed -i '1a echo "$(date +%T-%s) /etc/bashrc1" >>/tmp/oldboy' /etc/bashrc
sed -i '$a echo "$(date +%T-%s) /etc/bashrc2" >>/tmp/oldboy' /etc/bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bashrc1" >>/tmp/oldboy' ~/.bashrc
sed -i '$a echo "$(date +%T-%s) ~/.bashrc2" >>/tmp/oldboy' ~/.bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bash_profile1" >>/tmp/oldboy' ~/.bash_profile
sed -i '$a echo "$(date +%T-%s) ~/.bash_profile2" >>/tmp/oldboy' ~/.bash_profile

6. 环境变量的知识小结

1)变量名通常要大写。

2)变量可以在自身的Shell及子Shell中使用。

3)常用export来定义环境变量。

4)执行env默认可以显示所有的环境变量名称及对应的值。

5)输出时用“$变量名”,取消时用“unset变量名”。

6)书写crond定时任务时要注意,脚本要用到的环境变量最好先在所执行的Shell脚本中重新定义。

7)如果希望环境变量永久生效,则可以将其放在用户环境变量文件或全局环境变量文件里。

7. 变量中引号的使用

只有在变量的值中有空格的时候,会使用引号。

单引号与双引号的区别在于,是否能够解析特殊符号。

[root@oldboy ~]# name=oldboyedu
[root@oldboy ~]# name2='oldboy'
[root@oldboy ~]# name3=" https://blog.oldboyedu.com"
[root@oldboy ~]# echo $name
oldboyedu
[root@oldboy ~]# echo $name2
oldboy
[root@oldboy ~]# echo $name3
 https://blog.oldboyedu.com
[root@oldboy ~]# name4='old boy'
[root@oldboy ~]# echo $name4
old boy
[root@oldboy ~]# name5="old boy"
[root@oldboy ~]# echo $name5
old boy
[root@oldboy ~]# name6='old boy $PWD'
[root@oldboy ~]# echo $name6
old boy $PWD
[root@oldboy ~]# name6="old boy $PWD"
[root@oldboy ~]# echo $name6
old boy /root

8. 普通变量的要求

1) 内容是纯数字、简单的连续字符(内容中不带任何空格)时,定义时可以不加任何引号,例如:

a.oldboyAge=22

b.NETWORKING=yes

2) 没有特殊情况时,字符串一律用双引号定义赋值,特别是多个字符串中间有空格时,例如:

a.NFSD_MODULE="no load"

b.MyName="Oldboy is a handsome boy."

3) 当变量里的内容需要原样输出时,要用单引号(M),这样的需求极少,例如:

a.OLDBOY_NAME='OLDBOY'

变量使用反引号赋值

[root@oldboy scripts]# time=`date`
[root@oldboy scripts]# echo $time
2018年 12月 05日 星期三 09:02:06 CST

[root@oldboy scripts]# file=`ls`
[root@oldboy scripts]# echo $file
oldboy_test.sh panduan.sh quanju.sh yhk.sh

使用${}

打印变量的时候防止出现“金庸新著”的问题

[root@oldboy scripts]# time=`date`
[root@oldboy scripts]# echo $time_day
[root@oldboy scripts]# echo ${time}_day
2018年 12月 05日 星期三 09:02:06 CST_day
[root@oldboy scripts]# echo $time-day
2018年 12月 05日 星期三 09:02:06 CST-day

编写脚本测试${}

# 使用脚本测试
 [root@oldboy scripts]# vim bianliang.sh 
 #!/bin/bash
 time=`date`
 echo $timeday
 echo ${time}day

 [root@oldboy scripts]# sh  bianliang.sh     
 2018年 12月 05日 星期三 09:11:19 CSTday

9. 定义变量名技巧

1)变量名只能为字母、数字或下划线,只能以字母或下划线开头。

2)变量名的定义要有一定的规范,并且要见名知意。

示例:

oldboyAge=22 #<==每个单词的首字母大写的写法

oldboy_age=22 #<==单词之间用"_"的写法

oldboyAgeSex=man #<==驼峰语法:首个单词的首字母小写,其余单词首字母大写

oldboyAGE=22 #<==单词全大写的写法

3)一般的变量定义、赋值常用双引号;简单连续的字符串可以不加引号;希望原样输出时使用单引号。

4)希望变量的内容是命令的解析结果时,要用反引号'',或者用$()把命令括起来再赋值。

(0)

分享至