shell编程基础(三)

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参数说明

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180420G1SFDG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券