SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx

上传人:b****4 文档编号:16577716 上传时间:2022-11-24 格式:DOCX 页数:13 大小:19.58KB
下载 相关 举报
SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx_第1页
第1页 / 共13页
SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx_第2页
第2页 / 共13页
SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx_第3页
第3页 / 共13页
SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx_第4页
第4页 / 共13页
SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx

《SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

SHELL十三问之五varvalueexport 前后差在哪Word文档下载推荐.docx

不能以数字开头

$A=B 

名称不能有$

a=B 

这跟a=b是不同的

如下则是可以接受的设定:

A="

B"

IFS被关闭了(请参考前面的quoting章节)

A1=B 

并非以数字开头

A=$B 

$可用在变量值内

This_Is_A_Long_Name=b 

可用_连接较长的名称或值,且大小写有别。

*变量替换(substitution)*

Shell之所以强大,其中的一个因素是它可以在命令行中对变量作替换(substitution)处理。

在命令行中使用者可以使用$符号加上变量名称(除了在用=号定义变量名称之外),

将变量值给替换出来,然后再重新组建命令行。

比方:

$A=ls

$B=la

$C=/tmp

$$A-$B$C

(注意:

以上命令行的第一个$是shellprompt,并不在命令行之内。

必需强调的是,我们所提的变量替换,只发生在commandline上面。

(是的,让我们再回到commandline吧﹗)

仔细分析最后那行commandline,不难发现在被执行之前(在输入CR字符之前),

$符号会对每一个变量作替换处理(将变量值替换出来再重组命令行),最后会得出如下命令行:

ls-la/tmp

还记得第二章我请大家"

务必理解"

的那两句吗?

若你忘了,那我这里再重贴一遍:

若从技术细节来看,shell会依据IFS(InternalFieldSeperator)将commandline所输入的文字给拆解为"

字段"

(word)。

然后再针对特殊字符(meta)先作处理,最后再重组整行commandline。

这里的$就是commandline中最经典的meta之一了,就是作变量替换的﹗

在日常的shell操作中,我们常会使用echo命令来查看特定变量的值,例如:

$echo$A-$B$C

我们已学过,echo命令只单纯将其argument送至"

标准输出"

(STDOUT,通常是我们的荧幕)。

所以上面的命令会在荧幕上得到如下结果:

这是由于echo命令在执行时,会先将$A(ls)、$B(la)、跟$C(/tmp)给替换出来的结果。

利用shell对变量的替换处理能力,我们在设定变量时就更为灵活了:

A=B

B=$A

这样,B的变量值就可继承A变量"

当时"

的变量值了。

不过,不要以"

数学罗辑"

来套用变量的设定,比方说:

B=C

这样并不会让A的变量值变成C。

上面是单纯定义了两个不同名称的变量:

A与 

B,它们的值分别是B与 

C。

再如:

A=C

同样也不会让B的值换成C。

若变量被重复定义的话,则原有旧值将被新值所取代。

(这不正是"

可变的量"

吗?

^_^)

当我们在设定变量的时侯,请记着这点:

*用一个名称储存一个数值

仅此而已。

此外,我们也可利用命令行的变量替换能力来"

扩充"

(append)变量值:

A=B:

C:

D

A=$A:

E

这样,第一行我们设定A的值为"

B:

D"

,然后,第二行再将值扩充为"

A:

E"

上面的扩充范例,我们使用区隔符号(:

)来达到扩充目的,

要是没有区隔符号的话,如下是有问题的:

A=BCD

A=$AE

因为第二次是将A的值继承$AE的提换结果,而非$A再加E﹗

要解决此问题,我们可用更严谨的替换处理:

A=${A}E

上例中,我们使用{}将变量名称的范围给明确定义出来,

如此一来,我们就可以将A的变量值从BCD给扩充为BCDE。

(提示:

关于${name}事实上还可做到更多的变量处理能力,这些均属于比较进阶的变量处理,现阶段暂时不介绍了,请大家自行参考数据。

如CU的贴子:

*export*

严格来说,我们在当前shell中所定义的变量,均属于"

本地变量"

(localvariable),

只有经过export命令的"

输出"

处理,才能成为环境变量(environmentvariable):

$A=B

$exportA

或:

$exportA=B

经过export输出处理之后,变量A就能成为一个环境变量供其后的命令使用。

在使用export 

的时侯,请别忘记shell在命令行对变量的"

替换"

(substitution)处理,

比方说:

$B=C

$export$A

上面的命令并未将A输出为环境变量,而是将B作输出,

这是因为在这个命令行中,$A会首先被提换出B然后再"

塞回"

作export的参数。

要理解这个export,事实上需要从process的角度来理解才能透彻。

我将于下一章为大家说明process的观念,敬请留意。

*取消变量*

要取消一个变量,在bash中可使用unset命令来处理:

unsetA

与export一样,unset命令行也同样会作变量替换(这其实就是shell的功能之一),

因此:

$unset$A

事实上所取消的变量是B而不是A。

此外,变量一旦经过unset取消之后,其结果是将整个变量拿掉,而不仅是取消其变量值。

如下两行其实是很不一样的:

$A=

$unsetA

第一行只是将变量A设定为"

空值"

(null 

value),但第二行则让变量A不在存在。

虽然用眼睛来看,这两种变量状态在如下命令结果中都是一样的:

$echo$A

请学员务必能识别nullvalue与unset的本质区别,这在一些进阶的变量处理上是很严格的。

$str= 

#设为null

$var=${str=expr} 

#定义var

$echo$var

$echo$str

$unsetstr 

#取消

expr

聪明的读者(yes,you!

),稍加思考的话,

应该不难发现为何同样的var=${str=expr}在null与unset之下的不同吧?

若你看不出来,那可能是如下原因之一:

a.你太笨了

b.不了解 

var=${str=expr} 

这个进阶处理

c.对本篇说明还没来得及消化吸收

e.我讲得不好

不知,你选哪个呢?

.... 

^_^

再来解释一下var=${str=expr}:

首先,var=$str这个大家都可理解吧。

而接下来的思考方向是,究竟$str这个变量是如下哪一种情况呢:

1)unset

2)null

3)notnull

1)假如是unset,那么var=${str=expr}的结果将是:

var=expr

str=expr

2)假如是null,那var=${str=expr}的结果是:

var=

str=

3)假如是notnull(比方为xyz),那var=${str=expr}之结果是:

var=xyz

str=xyz

测试如下:

$showvar(){

>

var=${str=expr}

echo\$varis$var

echo\$stris$str

}

$unsetstr

$showvar

$varisexpr

$strisexpr

$str=

$varis

$stris

$str=xyz

$varisxyz

$strisxyz

接下来,再来看看var=${str:

=expr}好了:

1)$str为notset:

2)$str为null:

3)$str为notnull(str=xyz):

var=${str:

=expr}

最后比教一下${str=expr}与${str:

=expr}:

*两者在notset与notnull都一致

*但当null值时,${str=expr}会将$var与$str都设为null,但${str:

=expr}则设为expr

从这个再延伸出其它模拟,不防请大家"

实作"

观查一下有何不同?

var=${str-expr}vsvar=${str:

-expr}

var=${str+expr}vsvar=${str:

+expr}

var=${str?

expr}vsvar=${str:

?

expr}

var=${str-expr}

可以看出来${str-expr}与${str:

*两者在$str为notset与notnull都一致

*但当null值时,${str-expr}会将$var与$str都设为null,但${str:

-expr}则将$var设为expr

var=${str+expr}

$showvar

可以看出来${str+expr}与${str:

*但当null值时,${str+expr}会将$var与$str都设为expr,但${str:

+expr}则将$var设为null

var=${str?

expr

可以看出来${str?

expr}与${str:

*但当null值时,${str?

expr}会将$var与$str都设为null,但${str:

expr}则将$var设为expr

综上所述:

$var=${str=expr}与$var=${str:

$var=${str-expr}与$var=${str:

$var=${str+expr}与$var=${str:

$var=${str?

expr}与$var=${str:

*但当null值时不一致

分别描述如下:

$var=${str:

-expr}的功能:

当str非空的时候var赋值为str,否则(包括notset和null)将var赋值为expr

$var=${str-expr}的功能:

当str非空的时候var赋值为str,为空的时候var设置为null,notset的时候将var赋值为expr

=expr}的功能:

当str非空的时候var赋值为str,否则(包括notset和null)将var和str均赋值为expr

$var=${str=expr}的功能:

当str非空的时候var赋值为str,为空的时候var设置为null,notset的时候将var和str均赋值为expr

expr}的功能:

当str非空的时候var赋值为expr,否则将expr写入标准错误后退出

当str非空的时候var赋值为expr,为空的时候var设置为null,notset的时候将expr写入标准错误后退出

+expr}的功能:

当str非空的时候var赋值为expr,否则将不做任何操作

$var=${str+expr}的功能:

当str非空的时候var赋值为expr,为空的时候var设置为expr,notset的时候不做任何操作

看来还是带有冒号的简单,只有两种情况:

非空和其他,呵呵

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1