大数据兼云计算(王明龙)讲师-LINUX-DAY16-SHELL-变量

**

变量


**

变量分为:环境变量、预定义变量、自定义变量、位置变量、整数变量 


shell作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能
------------------------------------------------------------------------------------------------------------------------------
显示变量值
echo (显示文件或变量,或者把字符串输入到文件
echo $变量名  $变量名 ....... 同时可多显示几个值
echo ${变量名}wangjskdfddkj   {}防止变量名与其它字符混淆显示
echo -e  表达式    防止字符转义
echo -n  文件或变量名,或者表达式   表示回车不换行,linux系统默认回车换行
转义符 \c ,\f ,\t ,\n


1.环境变量:shell在开始执行时已经定义好的
------------------------------------------------------------------------------------
# env            //查看所有环境变量
# set             //查看所有变量
# export        //输出变量


$输出变量值
# echo $变量名 
# echo ${变量名}
# echo -e "字符串"                    //-e解析转意字符
# echo -n $变量值 或 "内容"     //-n 内容不回显到屏幕

echo -e 颜色
----------------------------------------------------------------------------------------------------------
shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 
格式如下:
echo -e "\033[字背景颜色;文字颜色m字符串\033[0m" 

例如:
echo -e "\033[41;36m something here \033[0m" 

其中41的位置代表底色, 36的位置是代表字的颜色 
注: 
  1、字背景颜色和文字颜色之间是英文的"" 
  2、文字颜色后面有个m 
  3、字符串前后可以没有空格,如果有的话,输出也是同样有空格 

例:下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[41;33m 红底黄字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"

字颜色:30—–37 
  echo -e "\033[30m 黑色字 \033[0m"
  echo -e "\033[31m 红色字 \033[0m"
  echo -e "\033[32m 绿色字 \033[0m"
  echo -e "\033[33m 黄色字 \033[0m"
  echo -e "\033[34m 蓝色字 \033[0m"
  echo -e "\033[35m 紫色字 \033[0m"
  echo -e "\033[36m 天蓝字 \033[0m"
  echo -e "\033[37m 白色字 \033[0m"
字背景颜色范围:40—–47
  echo -e "\033[40;37m 黑底白字 \033[0m"
  echo -e "\033[41;37m 红底白字 \033[0m"
  echo -e "\033[42;37m 绿底白字 \033[0m"
  echo -e "\033[43;37m 黄底白字 \033[0m"
  echo -e "\033[44;37m 蓝底白字 \033[0m"
  echo -e "\033[45;37m 紫底白字 \033[0m"
  echo -e "\033[46;37m 天蓝底白字 \033[0m"
  echo -e "\033[47;30m 白底黑字 \033[0m"
最后面控制选项说明
  \33[0m 关闭所有属性 
  \33[1m 设置高亮度 
  \33[4m 下划线 
  \33[5m 闪烁 
  \33[7m 反显 
  \33[8m 消隐 
  \33[30m — \33[37m 设置前景色 
  \33[40m — \33[47m 设置背景色 
  \33[nA 光标上移n行 
  \33[nB 光标下移n行 
  \33[nC 光标右移n行 
  \33[nD 光标左移n行 
  \33[y;xH设置光标位置 
  \33[2J 清屏 
  \33[K 清除从光标到行尾的内容 
  \33[s 保存光标位置 
  \33[u 恢复光标位置 
  \33[?25l 隐藏光标 
  \33[?25h 显示光标
----------------------------------------------------------------------------------------------------------




常用环境变量:
----------------------------------------------------------------------------------------------------------
USER             //查看当前用户
UID               //查看当前用户UID
HOME            //当前用户的家目录
HOSTNAME    //查看当前主机名
PWD             //查看当前目录
PS1               //命令提示符,通常是$字符,但在bash中,可以使用一些更复杂的值。例如,字符串[\u@\h\w]$就是一个流行的默认值,
                       它给出用户名/机器名和当前的目录名,当然也包括一个$提示符
PS2               //二级提示符,用来表示后续的输入,通常是 > 字符
PATH            //以冒号分隔的用来搜索命令的目录列表


2.预定义变量
----------------------------------------------------------------------------------------------------------
$0 进程名或脚本名
$$ 进程号
$? 与 [ exit 0exit 1 ]  命令执行后的返回状态.0 为执行正确,非 0 为执行错误
$# 位置参数的数量
$* 所有位置参数的内容

举例证明
# vim wml.sh
---------------------------------------------------------
echo $0 \$0 
echo $1 \$1 
echo $2 \$2
echo $# \$\#
echo $? \$\?
echo $$ \$\$
echo $* \$\*
---------------------------------------------------------
# chmod +x wml.sh
# ./wml.sh
# ./wml.sh aaa bbb
-------------------------------------------------------------------------------
wml.sh $0                 //脚本名     
aaa $1                      //aaa为第1个位置参数
bbb $2                     //bbb为第2个位置参数
2 $#                        //2位置参数量为20 $?                         //0代表脚本执行正解决,否则为非0
11484 $$                  //脚本的进程号11484
aaa bbb $*                //所有位置参数的内容


3.自定义变量
------------------------------------------------------------------------------------
定义临时变量(也可称为局部变量)

语法:
变量名=变量值

举例:
[root@localhost ~]# a=3
[root@localhost ~]# echo $a
3

多个变量同时赋值
# read  变量名1  变量名2  ....
输入变量值1  输入变量值2   ....

举例:
[root@localhost ~]# read a b c
1 2 3
[root@localhost ~]# echo $a $b $c
1 2 3

[root@bogon tmp]# read a e b   
111 322\ adsfa fdas                       #让e变量内容中空格正常输出

[root@bogon tmp]# echo $e
322 adsfa

设置只读变量
# readonly 变量名=变量值
注意:只要设置了它,就不能删除或修改了,只有更换终端或重启系统会被自动清除


举例:
[root@node1 ~]# readonly w=99
[root@node1 ~]# echo $w
99
[root@node1 ~]# read w 
11
-bash: w: 只读变量
[root@node1 ~]# w=111
-bash: w: 只读变量
[root@node1 ~]# export w=dkfja
-bash: w: 只读变量


定义永久变量:加了export就是全局变量,添加到开机启动文件中,就变成永久变量
第1步:定义全局变量
         # export 变量名=变量值2步:开机4个启动文件中添加全局变量,文件中均添加:export 变量名=变量值
         # vim /etc/bashrc         3
         # vim /etc/profile         2
         # vim ~/.bashrc           5
         # vim ~/.bash.profile    4
         # vim /etc/rc.local        1

注意:
112345代表启动顺序
2) 只要在当前终端使用export指定变量,当前终端此变量就不能被改变,因为它是全局变量




举例:
[root@localhost ~]# erp1=00
[root@localhost ~]# export erpwml=0
[root@localhost ~]# export erp=0     
[root@localhost ~]# export | grep erp
declare -x erp="0"
declare -x erpwml="0"

[root@localhost ~]# export |grep erp         //换了个终端就没有了变量
[root@localhost ~]# 
[root@localhost ~]# vim /etc/profile
export erp=0
[root@localhost ~]# sysctl -p
[root@localhost ~]# export |grep erp
declare -x erp="0"


删除变量或函数
unset 
语法:unset [-fv][变量或函数名称]

补充说明:unset为shell内建指令,可删除变量或函数。

参   数:
  -f  仅删除函数。 
  -v  仅删除变量

# unset -f 函数名
# unset -v 变量名

举例:
[root@localhost ~]# a=3
[root@localhost ~]# echo $a
3
[root@localhost ~]# unset a
[root@localhost ~]# echo $a

[root@localhost ~]# 



4.位置变量(一共系统规定为9个,9仅供参考)
------------------------------------------------------------------------------------
位置变量符
--------------------------------------
$0 脚本名
$1 脚本后第1个输入参数
$2 脚本后第2个输入参数
$3 脚本后第3个输入参数
.......
.......
$9 脚本后第9个输入参数

语法与用法:
-----------------------------------------------------------------------------
# vim /脚本名
# ./脚本名 内容1  内容2  ......内容9

举例:
[root@wml ~]# vim sss 
echo $1 \$1
echo $2 \$2
echo $3 \$3
echo $4 \$4
echo $5 \$5
echo $6 \$6
echo $7 \$7
echo $8 \$8
echo $9 \$9
echo $10 \$10
echo $11 \$11
echo $12 \$12
echo $13 \$13
echo $21 \$21
echo $61 \$61
echo $101 \$101
echo $# \$\#
echo $? \$\?
echo $$ \$\$
echo $* \$\*
sleep 800 &
echo "$!" \$\!

[root@wml ~]# ./sss a b c e f g h i j k r m n o p q
./sss $0
a $1
b $2
c $3
e $3
f $3
g $3
h $3
i $3
j $3
a0 $3
a1 $3
a2 $3
a3 $3
b1 $3
g1 $3
16 $#
0 $?
6404 $$
a b c e f g h i j k r m n o p q $*
6405 $!





举例:
-----------------------------------------------------------
[root@localhost ~]# vim wml.sh
#!/bin/bash
echo "$1"
echo "$2"
echo "$3"
echo "$4"
echo "$5"

[root@localhost ~]# sh wml.sh a b c d e    
a
b
c
d
e
[root@localhost ~]# sh wml.sh a b c
a
b
c



read 用来读取屏幕输入或是读取文件内容
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

语法:
------------------------------------------------------------------------
read 变量名 回车 变量值                                    //换行为变量名赋值
read 变量名 变量名... 回车 变量值 变量值....        //同时可多建变量名,换行赋值(每个变量值以空格分开,多余变量值默认给最后一个变量)
read -p "提示注释信息:" 变量名 回车 变量值       //提示信息:是用来提示用户应如何设置变量值

举例:
------------------------------------------------------------------------
[wml@localhost ~]$ read wml
123
[wml@localhost ~]$ echo $wml
123
[wml@localhost ~]$ read a b c d e
1 2 3 4 5
[wml@localhost ~]$ echo $a $b $c $d $e 
1 2 3 4 5
[wml@localhost ~]$ read -p "输入变量值:"  wml        
输入变量值:123



影响环境变量命令
------------------------------------------------------------------------------------------------------
1)declare(设置或显示变量)
declare                                                 ----显示系统所有变量
declare -r 变量名=变量值                     ----创建只读变量
declare -f                                              ----只显示函数名
declare -x 变量名=变量值                     ----创建转出变量
declare -i 变量名=变量值                      ----创建整数变量


使用 + 替代 - 可以颠倒选项的含义
-----------------------------------------------------
[root@bogon ~]# declare +r w=1
[root@bogon ~]# echo $w
1
[root@bogon ~]# read w
sadkfj
[root@bogon ~]# echo $w
sadkfj


2)export(创建环境变量与显示系统所有环境变量)
export                         //本身是查看所有环境变量
export 变量名               //设置某个变量作用于所有子shell中
export 变量名=变量值    //定义变量同时作用于所有子shell中
export -n 变量名           //把环境变量改为本地变量,也可称为全局变量改为局部变量
export -f                      //显示在"名-值”对中的名字是函数名
注意:设置环境变量时,要在父进程(父shell)中创建,在子shell中设置无效

3)readonly设置只读变量,只要设置了只读变量,就不能修改或删除此变量了
readonly 变量名               //设置已存在变量为只读变量
readonly 变量名=变量值    //定义变量同时设为只读
readonly -p                     //查看当前shell所有只读变量
readonly                         //查看当前shell所有只读变量


4)set设置或重设各种shell,和显示所有变量
set 查看系统中所有的shell变量,内容较多,所以要set | less 分页查看

5)清除自定义变量
unset 变量名                         //清除单个变量
unset  -f  变量名 ..变量名...     //清除多个只读变量

6) shift  n         //n代表数字,用于移动位置变量,调整位置变量,多用于脚本内
如使$3的值赋予$2,$2的值赋予$1.

shift具体实例:
shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)。

示例1:依次读取输入的参数并打印参数个数:
run.sh:
---------------------------------------------------------------------------------
#!/bin/bash  
while [ $# != 0 ];do  
echo "第一个参数为:$1,参数个数为:$#"  
shift  
done  
---------------------------------------------------------------------------------
输入如下命令运行:run.sh a b c d e f             //结果显示如下:
第一个参数为:a,参数个数为:6
第一个参数为:b,参数个数为:5
第一个参数为:c,参数个数为:4
第一个参数为:d,参数个数为:3
第一个参数为:e,参数个数为:2
第一个参数为:f,参数个数为:1

从上可知 shift(shift 1) 命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。

同理,shift n后,前n位参数都会被销毁,比如:
输入5个参数: abcde

那么$1=a,$2=b,$3=c,$4=d,$5=e,执行shift 3操作后,前3个参数a、b、c被销毁,就剩下了2个参数:d,e(这时d=$1,e=$2,其中d由$4—>$1,e由$5—>$2),参考示例如下:

示例2:
---------------------------------------------------------------------------------
#!/bin/bash  
while [ $# != 0 ];do
echo "第一个参数为:$1,参数个数为:$#"
shift 3
done
---------------------------------------------------------------------------------
[root@web ~]# ./s.sh a b c d e f
第一个参数为:a,参数个数为:6
第一个参数为:d,参数个数为:3


示例3:
---------------------------------------------------------------------------------
#!/bin/bash  
echo "参数个数为:$#,其中:"  
for i in $(seq 1 $#)  
do  
  eval j=\$$i  
  echo "$i个参数($"$i"):$j"  
done  

shift 3  

echo "执行shift 3操作后:"  
echo "参数个数为:$#,其中:"  
for i in $(seq 1 $#)  
do  
  #通过eval把i变量的值($i)作为变量j的名字  
  eval j=\$$i  
  echo "$i个参数($"$i"):$j"  
done  
---------------------------------------------------------------------------------
输出结果为:
参数个数为:5,其中:
第1个参数($1):a
第2个参数($2):b
第3个参数($3):c
第4个参数($4):d
第5个参数($5):e
执行shift 3操作后:
参数个数为:2,其中:
第1个参数($1):d
第2个参数($2):e

猜你喜欢

转载自blog.csdn.net/wangminglong1989/article/details/81509142