14 别名列表及数组.docx
- 文档编号:6048145
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:20
- 大小:23.02KB
14 别名列表及数组.docx
《14 别名列表及数组.docx》由会员分享,可在线阅读,更多相关《14 别名列表及数组.docx(20页珍藏版)》请在冰豆网上搜索。
14别名列表及数组
14别名、列表及数组
14.1、别名
bashShell提供的别名(alias)这种机制可以对Linux命令进行重新命名,或以简洁的名字表示命令及其冗长的选项和参数,极大地方便用户使用Linux系统,并增加用户的工作效率,也方便了用户记忆长命令和定制自己熟悉的工作环境。
BashShell的别名实际上是一种避免输入长命令的手段,是为长命令起一个新的名字作为其缩写。
别名的命令关键字是alias,命令的基本格式为:
aliasalias-name='original-command'
当original-command是以空格分隔的字符串时,就要将original-command用引号引起来,而且等号两边是不能有空格的。
执行:
aliasdir=ls
dir
结果:
1evalre.shfunction9.shrunsec.sh
10.shevalsourcehfileselect_exam1.sh
使用alias设置别名之后,如果要删除已经设置的别名,可使用unalias命令,unalias是一个内建命令,有两种格式:
unalias-a#删除所有已设置的别名
unaliasalias-name#仅将别名alias-name删除
执行:
alias#查看已设置的别名
结果:
aliascdglo='cd..'
aliasegrep='egrep--color=auto'
aliasfgrep='fgrep--color=auto'
执行:
unaliascdglo#将别名cdglo删除
alias
结果:
aliasegrep='egrep--color=auto'
aliasfgrep='fgrep--color=auto'
执行:
cdglo
结果:
bash:
cdglo:
未找到命令...#说明别名cdglo已被删除
例:
在脚本中使用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
vardetail
结果:
-rw-r--r--.1rootroot1287587月1118:
31/root/install.log
-rw-r--r--.1rootroot178157月1118:
18/root/install.log.syslog
#以上结果表明该脚本能够设置别名,且别名依然能使用通配符
-rw-r--r--.1rootroot1287587月1118:
31/root/install.log
-rw-r--r--.1rootroot178157月1118:
18/root/install.log.syslog
#以上结果表明alias命令能够引用变量
Deletingallaliases:
./alias.sh:
行13:
detail:
未找到命令#删除别名成功
./alias.sh:
行14:
vardetail:
未找到命令
expand_aliases选项表示别名可以被扩展,如果没有打开expandaliases选项,那么即使使用alias命令建立别名,也不可以执行这些别名,因此,若要在脚本中使用别名功能,必须在脚本中首先执行这条shopt命令。
该脚本在利用alias命令设置别名时,都是使用双引号,双引号和单引号在处理空格时是等价的。
因此,双引号也可以用于设置别名,但是,设置vardetail别名时,由于里面引用了变量,此时就只能使用双引号,因为单引号会把$符号解析为字面含义。
alias命令不能在诸如if/then结构、循环和函数等混合型结构中使用,但是可以执行在混合型结构之外所设置的别名。
例:
测试别名能否在if/then、while循环内使用
#!
/bin/bash
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
echo"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。
例:
与列表的基本用法
#!
/bin/bash
if[-n"$1"]&&echo"The1stargument=$1"&&[-n"$2"]&&echo"The2ndargument=$2"
then
#只有与列表命令都执行完,才执行下面的命令
echo"AtleastTWOargumentsarepassedtothisscript."
else
echo"LessthenTWOargumentsarepassedtothisscript."
fi
exit0
执行:
./andlist1.sh#不带输入参数
结果:
LessthenTWOargumentsarepassedtothisscript.
执行:
./andlist1.shCAI#带1个输入参数
结果:
The1stargument=CAI
LessthenTWOargumentsarepassedtothisscript.
执行:
./andlist1.shCAIWU#带2个输入参数
结果:
The1stargument=CAI
The2ndargument=WU
AtleastTWOargumentsarepassedtothisscript.
例:
与列表的基本用法
#!
/bin/bash
MAXARGS=3#输入参数的个数
ERROR=68#输入参数不等于MAXARGS时的返回状态码
test$#-ne$MAXARGS&&echo"Usage:
`basename$0`$MAXARGSarguments"&&exit$ERROR
#上面与列表未全部执行完毕时,才执行下面的命令
echo"Correctargumentsarepassedtothisscript."
exit0
执行:
./andlist2.shCAI
结果:
Usage:
andlist2.sh3arguments
执行:
echo$?
结果:
68
执行:
./andlist2.shCAIWUTANG
结果:
Correctargumentsarepassedtothisscript.
执行:
echo$?
结果:
0
例:
利用或列表实现对输入参数的个数判断
#!
/bin/bash
MAXARGS=3
ERROR=68
test$#-eq$MAXARGS||(echo"Usage:
`basename$0`$MAXARGSarguments"&&false)||exit$ERROR
echo"Correctargumentsarepassedtothisscript."
exit0
执行:
./orlist.shCAI
结果:
Usage:
orlist.sh3arguments
执行:
echo$?
结果:
68
执行:
./orlist.shCAIWUTANG
结果:
Correctargumentsarepassedtothisscript.
执行:
echo$?
结果:
0
该脚本中的test命令实际上是或列表和与列表的嵌套,圆括号中是一个包含两个命令的与列表,这说明Shell是支持与或列表的嵌套的,在使用与或列表嵌套时需要利用圆括号区分逻辑运算的优先级。
14.3、数组
14.3.1、数组的基本用法
bashShell只支持一维数组,数组从0开始标号。
bashShell所支持的最大数组标号是599147937791,用户完全可以定义足够长的数组。
bashShell取得数组值(即引用一个数组元素)的命令格式为:
${array[x]}#引用array数组标号为x的值
注意:
$符号后面的花括号比不可少。
例:
数组赋值的方法
#!
/bin/bash
city[0]=Nanjing
city[1]=Beijing
city[9]=Melbourne#对第10个数组元素赋值,Shell允许数组空缺元素
city[15]=NewYork
echo"city[0]=${city[0]}"
echo"city[1]=${city[1]}
echo"city[9]=${city[9]}"
echo"city[15]=${city[15]}"
echo"city[2]=${city[2]}"#打印未初始化数组的值
echo"city[10]=${city[10]}"
结果:
city[0]=Nanjing
city[1]=Beijing
city[9]=Melbourne
city[15]=NewYork
city[2]=
city[10]=
用圆括号结构对数组赋值时,在默认情况下,从数组第0个元素开始赋值,将圆括号内以空格为分隔符,依次符给数组元素。
例:
用圆括号对数组赋值的方法
#!
/bin/bash
city=(NanjingBeijingMelbourneNewYork)
echo"city[0]=${city[0]}"
echo"city[1]=${city[1]}"
echo"city[2]=${city[2]}"
echo"city[3]=${city[3]}"
echo"city[4]=${city[4]}"
echo"city[5]=${city[5]}"
圆括号结构对数组赋值可以指定所赋元素的标号,并以此标号为起点,继续下面的赋值。
例:
用圆括号对数组赋值的用法
#!
/bin/bash
#[10]指定city数组标号为10的元素的值
city=(Nanjing[10]=AtlantaMassachusettsMarseilles)
echo"city[0]=${city[0]}"
echo"city[1]=${city[1]}"
echo"city[10]=${city[10]}"
echo"city[11]=${city[11]}"
echo"city[12]=${city[12]}"
echo"city[13]=${city[13]}"
圆括号还可以按照任意顺序指定任意元素对数组赋值。
例:
用圆括号对数组赋值的方法
#!
/bin/bash
#以任意顺序指定位置为数组赋值
city=([2]=Nanjing[10]=Atlanta[1]=Massachusetts[5]=Marseilles)
echo"city[1]=${city[1]}"
echo"city[2]=${city[2]}"
echo"city[5]=${city[5]}"
echo"city[10]=${city[10]}"
bashShell默认将变量看做是只有一个元素的数组,而且@和*符号都可用来表示数组的元素。
例:
#!
/bin/bash
onearray=WebAPIs
echo${onearray[@]}
echo${onearray[*]}
echo${onearray[0]}
echo${#onearray[1]}#onearray[1]未被赋值
echo${#onearray[*]}#输出onearray数组的长度
结果:
WebAPIs
WebAPIs
WebAPIs
0
1
$@和$*都表示传递到脚本的所有参数,在数组中,@和*符号与位置参数类似,表示“全部”,即array[@]和array[*]都表示array数组的所有元素。
@和*符号最常见的应用是打印数组的所有元素。
例:
利用@和*符号打印数组的所有元素
#!
/bin/bash
city=(NanjingBeijingMelbourneNewYork)
foriin${city[@]}#将@替换为*亦可
do
echo$i
done
结果:
Nanjing
Beijing
Melbourne
NewYork
该脚本中的for循环格式是遍历数组所有元素的通用格式。
例:
当数组不连续赋值时,@和*符号的输出结果
#!
/bin/bash
city[1]="HongKong"
city[100]=Massachusetts
city[101]=NewYork
city[10000]=Atlanta
foriin“${city[@]}”#需要用引号将${city[@]}引起
do
echo$i
done
结果:
HongKong
Massachusetts
NewYork
Atlanta
由于city数组元素中包含了空格,因此,需要用引号将${city[@]}引起来。
当用引号将${city[@]}引起时,“${city[@]}”与“${city[*]}”存在细微的差别,“${city[@]}”将数组的所有元素分行打印,而“${city[*]}”只能将数组的所有元素打印在以行内,中间以IFS分隔。
for循环使用${city[*]}时脚本的执行结果为:
HongKongMassachusettsNewYorkAtlanta
总的来说,for循环与@(或*)符号结合使用可以很方便地遍历数组元素,不论数组是如何赋值的,当不用引号时,@和*完全等价,但是,当时用引号时,@和*打印数组元素的方式存在区别
14.3.2、数组的特殊用法
数组字符串操作的特殊之处在于所有的操作都是针对所有的数组元素逐个进行的。
例:
数组的字符串操作
#!
/bin/bash
city=(NanjingAtlantaMassachusettsMarseilles)
echo"ExtractingSubstring"
echo${city[*]:
0}#抽取整个数组
echo${city[*]:
1}#抽取从第1个元素到结束的数组
echo${city[*]:
3}#抽取从第3个元素到结束的数组
echo${city[*]:
0:
2}#抽取从第0个元素开始的2个元素
echo
echo"RemovingSubstring"
echo${city[*]#M*a}#删除从M到a的最短子串
echo${city[*]##M*a}#删除从M到a的最长子串
echo
echo"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
NanjingAtlantaYearYear
Shell在对一般字符串进行抽取操作时,冒号后的数字表示的是第几个字符,而进行数组的抽取操作时,冒号后的数字表示的是第几个元素。
${city[*]/M*s/Year}和${city[*]//M*s/Year}两条命令得到同样的结果,是因为/符号第1次匹配子串和//符号匹配全部子串都是对于一个数组元素而言,Massachusetts和Marseilles都只有1个与M*s匹配的子串。
数组也可以存放read命令所读入的用户输入参数,而且内建命令unset可以用于清空数组元素或整个数组。
例:
数组与read命令、unset命令的用法
#!
/bin/bash
declare-aarrivedcity#将arrivedcity声明为数组
echo"Whatcityhaveyoubeenarrived?
"
echo"TheinputshouldbeseparatedfromeachotherbyaSPACE"
read-aarrivedcity#将用户输入存储到arrivedcity数组
echo
foriin"${arrivedcity[@]}"#for循环输出数组的全部内容
do
echo"$i"
done
echo"Thelengthofthisarrayis${#arrivedcity[@]}."
echo"ExecutingUNSEToperation.............."
unsetarrivedcity[1]#清空arrivedcity[1]元素
echo"Thelengthofthisarrayis${#arrivedcity[@]}."
echo"ExecutingUNSEToperation.............."
unsetarrivedcity#清空整个数组
echo"Thelengthofthisarrayis${#arrivedcity[@]}."
结果:
Whatcityhaveyoubeenarrived?
TheinputshouldbeseparatedfromeachotherbyaSPACE
ShanghaiDalianMelbourneSuzhouBeijing
Shanghai
Dalian
Melbourne
Suzhou
Beijing
Thelengthofthisarrayis5.
ExecutingUNSEToperation..............
Thelengthofthisarrayis4.
ExecutingUNSEToperation..............
Thelengthofthisarrayis0.
Shell数组还有一种重要的操作——数组连接。
例:
数组的连接操作
#!
/bin/bash
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数组内容
do
echo"Element[$index]=${combine[$index]}"
let"index=$index+1"
done
echo
#下面是另外一种数组连接方式
unsetcombine#清空combine
combine[0]=${city[@]}#将city数组作为combine的一个元素
combine[1]=${person[@]}#将person数组作为combine的另一个元素
#再次输出combine数组
element_count=${#combine[@]}
index=0
while["$index"-lt"$element_count"]
do
echo"Element[$index]=${combine[$index]}"
let"index=$index+1"
done
echo
结果:
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数组的赋值是不连续的,但是,进行数组连接操作
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 14 别名列表及数组 别名 列表 数组