您的位置:首页 > 运维架构 > Shell

shell入门教程(2)-变量和参数

2015-03-05 14:19 302 查看
shell入门教程(1)-shell基础 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/43795131

shell入门教程(2)-变量和参数 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/44081993

shell入门教程(3)-命令编辑 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/44617445

shell入门教程(4)-作业控制 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/46801163

SHELL入门教程(5)-算术运算 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/47025297

SHELL入门教程(6)-环境 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/47025321

SHELL入门教程(7)-编写脚本 - justkk的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/justkk/article/details/47025397

 

一、变量与属性

 

1、定义变量并赋值

X=abc 定义变量X,并赋值为abc

Y=  定义变量Y,其值为空

2、变量引用,在变量名称之前添加符号$,如:下面的命令显示变量X的值

echo $X

3、变量属性

变量可以有一个或多个属性,指定他们的内部表示,访问或范围,或显示方式。

使用typeset命令定义变量值和/或属性

typeset -attribute variable=value

3.1 小写(-l)大写(-u)属性

typeset -l a=ABCD

echo $a

定义一个小写属性的变量a,并赋值为大写字符串ABCD。最终效果是变量被实际赋值为abcd

3.2 只读(-r)属性

typeset -r b=3

b=4

此时报错,因为变量b是只读的,不能被修改。

3.3 整形(-i)属性

typeset -i b=3

虽然为变量赋值为整数时不必设置这个属性,但是整形属性有一些好处,后面算术运算章节详述。

3.4 移除变量属性,使用typeset +attribute,如:

typeset +i b

移除变量b的整形属性,此时b可以被赋值为一个字符串,如abc

3.5 检查变量属性,下面的命令显示所有整形变量

typeset -i

4、更多用法

把一个变量的值赋值给另外一个变量:X=$HOME

把命令的输出结果赋值给变量:XX=$(command)或XX=`command`

如:XX=$(date); echo $XX

把文件file的内容赋值给变量:XX=$(<file),注意此时文件的内容整体作为一行赋值给变量。

清除变量:unset XX

 

二、特殊参数

 

有一些特殊参数由shell自动赋值。

$?  最近一条命令的退出状态

用以判断命令执行成功与否。通常0表示成功,其他表示失败。

在管道中使用时,$?包含管道中最后一条命令的退出状态。

示例(其中nofile表示一个不存在的文件):

date;echo $?

ls nofile;echo $?

$$  当前shell的进程ID

$-  当前生效的shell选项

$!  最近一条后台命令或协作进程的进程ID

 

三、变量引用

 

基本的引用方式前面已经提到了,在变量名称之前添加符号$,如$X。

为了清晰的界定变量名称,建议在变量名称前后添加{},如${X},这在变量名称与其他字符相连时特别有用。示例:

X=3;echo $X3

会不会显示33呢??结果是什么也没有。因为shell把X3作为变量的名称,而变量X3是不存在的。

修改一下:X=3;echo ${X}3

${#variable}  计算变量值的长度

X=abc;echo ${#X}

结果是3

${var:-word} 变量var定义并且非空时,扩展为变量var的值,否则扩展为word

${var-word} 变量var定义时,扩展为变量var的值,否则扩展为word

试验:x=abc;echo ${x:-def}

x=

echo ${x:-def}

echo ${x-def}

${variable:=word}  变量定义且非空时,扩展为变量的值,否则变量设置为word

${variable=word}  变量定义时,扩展为变量的值,否则变量设置为word

${variable:+word}  变量定义且非空时,扩展为word

${variable+word} 变量定义时,扩展为word

${variable:?}  变量定义且非空时,扩展为变量的值,否则输出parameter null or not set并退出

${variable?}  变量定义时,扩展为变量的值,否则输出parameter null or not set并退出

${variable:?word}  变量定义且非空时,扩展为变量的值,否则输出word并退出

${variable?word} 变量定义时,扩展为变量的值,否则输出word并退出

${variable#pattern} 从头删除最小匹配pattern之后的部分

${variable##pattern}  从头删除最大匹配pattern之后的部分

${variable%pattern} 从尾删除最小匹配pattern之后的部分

${variable%%pattern}  从尾删除最大匹配pattern之后的部分

示例:

x=a123

echo ${x%[0-9]*}

echo ${x%%[0-9]*}

${variable//pattern1/pattern2}  把变量中所有pattern1替换为pattern2

${variable/pattern1/pattern2}  把变量中第一个pattern1替换为pattern2

${variable/#pattern1/pattern2}  如果变量以pattern1打头,把变量中第一个pattern1替换为pattern2

${variable/%pattern1/pattern2}  如果变量以pattern1结尾,把变量中最后一个pattern1替换为pattern2

${variable:start} 返回变量中从start开始的部分

${variable:start:length} 返回变量中从start开始的length个字符

示例:

X=abc123456

echo ${X:1}

echo ${X:1:3}

 

四、数组变量

 

数组变量定义形式:typeset
aa[0]=1 aa[1]=2 aa[2]=3 aa[6]=7

或者,简单的aa[0]=1 aa[1]=2 aa[2]=3 aa[6]=7

注意数组元素的下标从0开始

${aa}等价于${aa[0]},都表示第一个元素

${aa[*]}或${aa[@]},表示全部数组元素

${#aa[*]}或${#aa[@]},表示数组元素数目

${!aa[*]}或${!aa[@]},表示数组下标列表

数组变量属性

与普通变量一样,数组变量也可以指定属性,同样使用typeset命令

关联数组(可以使用字符串作为数组下标)

使用typeset -A命令定义,示例:

typeset -A bb

bb[dm]=2

bb[ff]=3

echo ${bb[dm]}

echo ${!bb[@]}

echo ${bb[@]}

 

五、引号

 

有3类引号:单引号、双引号、反引号

变量赋值包含空白字符或特殊字符时,可以使用引号。

单引号和双引号是类似的,反引号用以执行命令输出替换。

单引号

单引号内的特殊字符将失去其特殊含义,仅仅表示特殊字符本身,如:echo'$‘

双引号

双引号与单引号类似,但是不移除这3个特殊字符的特殊含义:$ ` \

如果想显示双引号内的特殊字符本身,可以在特殊字符前面添加反斜线\,如echo"\"“

反引号,用以执行命令输出替换,之前已经提到了。如:

aa=`date`; echo $aa

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息