14 别名列表及数组Word格式文档下载.docx
《14 别名列表及数组Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《14 别名列表及数组Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
例:
在脚本中使用alias命令
#!
/bin/bash
shopt-sexpand_aliases#设置此选项后,脚本才可以使用别名功能
aliasdetail="
ls-l"
detail/root/in*#别名后使用了通配符
echo
directory=/root/
prefix=in*
aliasvardetail="
ls-l$directory$prefix"
#引号内加入了变量
vardetail
echo"
Deletingallaliases:
"
#删除别名
unaliasdetail
unaliasvardetail
#测试是否成功删除别名
detail
-rw-r--r--.1rootroot1287587月1118:
31/root/install.log
-rw-r--r--.1rootroot178157月1118:
18/root/install.log.syslog
#以上结果表明该脚本能够设置别名,且别名依然能使用通配符
-rw-r--r--.1rootroot1287587月1118:
#以上结果表明alias命令能够引用变量
Deletingallaliases:
./alias.sh:
行13:
detail:
未找到命令#删除别名成功
行14:
vardetail:
未找到命令
expand_aliases选项表示别名可以被扩展,如果没有打开expandaliases选项,那么即使使用alias命令建立别名,也不可以执行这些别名,因此,若要在脚本中使用别名功能,必须在脚本中首先执行这条shopt命令。
该脚本在利用alias命令设置别名时,都是使用双引号,双引号和单引号在处理空格时是等价的。
因此,双引号也可以用于设置别名,但是,设置vardetail别名时,由于里面引用了变量,此时就只能使用双引号,因为单引号会把$符号解析为字面含义。
alias命令不能在诸如if/then结构、循环和函数等混合型结构中使用,但是可以执行在混合型结构之外所设置的别名。
测试别名能否在if/then、while循环内使用
shopt-sexpand_aliases
aliascopy=cp#在循环体之外设置别名copy
count=0#建立计数器
while:
do
aliasipconfig=ifconfig#在循环体之内设置别名ipconfig
letcount=count+1#计数器增加1
if[$count-ge2]#若count大于等于2,则进入if/then结构
then
echo"
Usingaliasinif/thenstructure"
ipconfig#在if/then结构内执行别名ipconfig
break#跳出while循环
fi
Usingaliasinwhileloopstucture"
copyoutputoutputnew#在while循环体内执行别名copy
done
Usingaliasinwhileloopstucture
#第1次循环count<
1,执行别名copy,Shell未报错说明copy执行成功
Usingaliasinif/thenstructure
./loopalias.sh:
行12:
ipconfig:
#第2次循环在if/then结构内执行ipconfig,Shell报错,找不到ipconfig命令
lsoutpu*#outputnew已存在,说明copy命令已经执行成功
outputoutputnewoutputnull
14.2、列表
列表由一串命令用与运算(&
&
)和或运算(||)连接而成,用与运算连接的列表称为与列表(andlist),用或运算连接的列表称为或列表(orlist)。
与列表的基本格式为:
命令1&
命令2&
...&
命令n
该格式的与列表从左至右依次执行命令,直到某命令返回FALSE时,与列表执行终止。
或列表的基本格式为:
命令1||命令2||...||命令n
或列表依然是从左至右依次执行命令,但它是当某命令返回TRUE时,或列表执行终止。
上述提及的TRUE和FALSE是由返回的退出状态来决定的,若退出状态为0,则为TRUE,否则为FALSE。
与列表的基本用法
if[-n"
$1"
]&
The1stargument=$1"
&
[-n"
$2"
The2ndargument=$2"
then
#只有与列表命令都执行完,才执行下面的命令
AtleastTWOargumentsarepassedtothisscript."
else
LessthenTWOargumentsarepassedtothisscript."
fi
exit0
./andlist1.sh#不带输入参数
LessthenTWOargumentsarepassedtothisscript.
./andlist1.shCAI#带1个输入参数
The1stargument=CAI
LessthenTWOargumentsarepassedtothisscript.
./andlist1.shCAIWU#带2个输入参数
The2ndargument=WU
AtleastTWOargumentsarepassedtothisscript.
MAXARGS=3#输入参数的个数
ERROR=68#输入参数不等于MAXARGS时的返回状态码
test$#-ne$MAXARGS&
Usage:
`basename$0`$MAXARGSarguments"
exit$ERROR
#上面与列表未全部执行完毕时,才执行下面的命令
Correctargumentsarepassedtothisscript."
./andlist2.shCAI
andlist2.sh3arguments
echo$?
68
./andlist2.shCAIWUTANG
Correctargumentsarepassedtothisscript.
利用或列表实现对输入参数的个数判断
MAXARGS=3
ERROR=68
test$#-eq$MAXARGS||(echo"
false)||exit$ERROR
./orlist.shCAI
orlist.sh3arguments
./orlist.shCAIWUTANG
该脚本中的test命令实际上是或列表和与列表的嵌套,圆括号中是一个包含两个命令的与列表,这说明Shell是支持与或列表的嵌套的,在使用与或列表嵌套时需要利用圆括号区分逻辑运算的优先级。
14.3、数组
14.3.1、数组的基本用法
bashShell只支持一维数组,数组从0开始标号。
bashShell所支持的最大数组标号是599147937791,用户完全可以定义足够长的数组。
bashShell取得数组值(即引用一个数组元素)的命令格式为:
${array[x]}#引用array数组标号为x的值
注意:
$符号后面的花括号比不可少。
数组赋值的方法
city[0]=Nanjing
city[1]=Beijing
city[9]=Melbourne#对第10个数组元素赋值,Shell允许数组空缺元素
city[15]=NewYork
city[0]=${city[0]}"
city[1]=${city[1]}
city[9]=${city[9]}"
city[15]=${city[15]}"
city[2]=${city[2]}"
#打印未初始化数组的值
city[10]=${city[10]}"
city[1]=Beijing
city[9]=Melbourne
city[15]=NewYork
city[2]=
city[10]=
用圆括号结构对数组赋值时,在默认情况下,从数组第0个元素开始赋值,将圆括号内以空格为分隔符,依次符给数组元素。
用圆括号对数组赋值的方法
city=(NanjingBeijingMelbourneNewYork)
city[1]=${city[1]}"
city[3]=${city[3]}"
city[4]=${city[4]}"
city[5]=${city[5]}"
圆括号结构对数组赋值可以指定所赋元素的标号,并以此标号为起点,继续下面的赋值。
用圆括号对数组赋值的用法
#[10]指定city数组标号为10的元素的值
city=(Nanjing[10]=AtlantaMassachusettsMarseilles)
city[11]=${city[11]}"
city[12]=${city[12]}"
city[13]=${city[13]}"
圆括号还可以按照任意顺序指定任意元素对数组赋值。
#以任意顺序指定位置为数组赋值
city=([2]=Nanjing[10]=Atlanta[1]=Massachusetts[5]=Marseilles)
bashShell默认将变量看做是只有一个元素的数组,而且@和*符号都可用来表示数组的元素。
onearray=WebAPIs
echo${onearray[@]}
echo${onearray[*]}
echo${onearray[0]}
echo${#onearray[1]}#onearray[1]未被赋值
echo${#onearray[*]}#输出onearray数组的长度
WebAPIs
WebAPIs
0
1
$@和$*都表示传递到脚本的所有参数,在数组中,@和*符号与位置参数类似,表示“全部”,即array[@]和array[*]都表示array数组的所有元素。
@和*符号最常见的应用是打印数组的所有元素。
利用@和*符号打印数组的所有元素
foriin${city[@]}#将@替换为*亦可
echo$i
Nanjing
Beijing
Melbourne
NewYork
该脚本中的for循环格式是遍历数组所有元素的通用格式。
当数组不连续赋值时,@和*符号的输出结果
city[1]="
HongKong"
city[100]=Massachusetts
city[101]=NewYork
city[10000]=Atlanta
foriin“${city[@]}”#需要用引号将${city[@]}引起
do
HongKong
Massachusetts
Atlanta
由于city数组元素中包含了空格,因此,需要用引号将${city[@]}引起来。
当用引号将${city[@]}引起时,“${city[@]}”与“${city[*]}”存在细微的差别,“${city[@]}”将数组的所有元素分行打印,而“${city[*]}”只能将数组的所有元素打印在以行内,中间以IFS分隔。
for循环使用${city[*]}时脚本的执行结果为:
HongKongMassachusettsNewYorkAtlanta
总的来说,for循环与@(或*)符号结合使用可以很方便地遍历数组元素,不论数组是如何赋值的,当不用引号时,@和*完全等价,但是,当时用引号时,@和*打印数组元素的方式存在区别
14.3.2、数组的特殊用法
数组字符串操作的特殊之处在于所有的操作都是针对所有的数组元素逐个进行的。
数组的字符串操作
city=(NanjingAtlantaMassachusettsMarseilles)
ExtractingSubstring"
echo${city[*]:
0}#抽取整个数组
1}#抽取从第1个元素到结束的数组
3}#抽取从第3个元素到结束的数组
0:
2}#抽取从第0个元素开始的2个元素
RemovingSubstring"
echo${city[*]#M*a}#删除从M到a的最短子串
echo${city[*]##M*a}#删除从M到a的最长子串
ReplcingSubstring"
echo${city[*]/M*s/Year}#替换第1次与M*s匹配的子串
echo${city[*]//M*s/Year}#替换所有与M*s匹配的子串
ExtractingSubstring
NanjingAtlantaMassachusettsMarseilles
AtlantaMassachusettsMarseilles
Marseilles
NanjingAtlanta
RemovingSubstring
NanjingAtlantassachusettsrseilles
NanjingAtlantachusettsrseilles
ReplcingSubstring
NanjingAtlantaYearYear
Shell在对一般字符串进行抽取操作时,冒号后的数字表示的是第几个字符,而进行数组的抽取操作时,冒号后的数字表示的是第几个元素。
${city[*]/M*s/Year}和${city[*]//M*s/Year}两条命令得到同样的结果,是因为/符号第1次匹配子串和//符号匹配全部子串都是对于一个数组元素而言,Massachusetts和Marseilles都只有1个与M*s匹配的子串。
数组也可以存放read命令所读入的用户输入参数,而且内建命令unset可以用于清空数组元素或整个数组。
数组与read命令、unset命令的用法
declare-aarrivedcity#将arrivedcity声明为数组
Whatcityhaveyoubeenarrived?
TheinputshouldbeseparatedfromeachotherbyaSPACE"
read-aarrivedcity#将用户输入存储到arrivedcity数组
foriin"
${arrivedcity[@]}"
#for循环输出数组的全部内容
$i"
Thelengthofthisarrayis${#arrivedcity[@]}."
ExecutingUNSEToperation.............."
unsetarrivedcity[1]#清空arrivedcity[1]元素
unsetarrivedcity#清空整个数组
TheinputshouldbeseparatedfromeachotherbyaSPACE
ShanghaiDalianMelbourneSuzhouBeijing
Shanghai
Dalian
Suzhou
Thelengthofthisarrayis5.
ExecutingUNSEToperation..............
Thelengthofthisarrayis4.
Thelengthofthisarrayis0.
Shell数组还有一种重要的操作——数组连接。
数组的连接操作
city=(BeijingNanjingShanghai)
person=(Cai[5]=WuTang)
declare-acombine#声明combine数组
combine=(${city[@]}${person[@]})#combine是city和person的连接
element_count=${#combine[@]}
index=0
while["
$index"
-lt"
$element_count"
]#用while循环输出combine数组内容
Element[$index]=${combine[$index]}"
let"
index=$index+1"
#下面是另外一种数组连接方式
unsetcombine#清空combine
combine[0]=${city[@]}#将city数组作为combine的一个元素
combine[1]=${person[@]}#将person数组作为combine的另一个元素
#再次输出combine数组
element_count=${#combine[@]}
]
Element[0]=Beijing
Element[1]=Nanjing
Element[2]=Shanghai
Element[3]=Cai
Element[4]=Wu
Element[5]=Tang
Element[0]=BeijingNanjingShanghai
Element[1]=CaiWuTang
尽管person数组的赋值是不连续的,但是,进行数组连接操作