欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

shell入门教程(2)

程序员文章站 2022-06-13 09:13:31
...

一、 变量与属性 1 、定义变量并赋 X= abc 定义变量 X ,并赋为 abc Y= 定义变量 Y ,其为空 2 、变量引用,在变量名称之前添加符号 $ ,如:下面的命令显示变量 X 的 echo $X 3 、变量属性 变量可以有一个或多个属性,指定他们的内部表示,访问或范围,或显

一、变量与属性

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=$(,注意此时文件的内容整体作为一行赋值给变量。

清除变量:unset XX

二、特殊参数

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

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

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

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

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

date;echo $?

ls nofile;echo $?

$$ 当前shell的进程ID

$- 当前生效的shell选项

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

三、变量引用

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

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

X=3;echo $X3

会不会显示33呢??结果是什么也没有。因为shellX3作为变量的名称,而变量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