一、 变量与属性 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呢??结果是什么也没有。因为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