📄 arrays.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>数组</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="高级主题"HREF="part4.html"><LINKREL="PREVIOUS"TITLE="列表结构"HREF="list-cons.html"><LINKREL="NEXT"TITLE="/dev和/proc"HREF="devproc.html"></HEAD><BODYCLASS="CHAPTER"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="list-cons.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom"></TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="devproc.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="CHAPTER"><H1><ANAME="ARRAYS"></A>26. 数组</H1><P><ANAME="ARRAYREF"></A></P><P>新版本的Bash支持一维数组. 数组元素可以使用符号<KBDCLASS="USERINPUT">variable[xx]</KBD>来初始化. 另外, 脚本可以使用<KBDCLASS="USERINPUT">declare -a variable</KBD>语句来指定一个数组. 如果想解引用一个数组元素(也就是取值), 可以使用<ICLASS="FIRSTTERM">大括号</I>, 访问形式为<KBDCLASS="USERINPUT">${variable[xx]}</KBD>. </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX66"></A><P><B>例子 26-1. 简单的数组使用</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 3 4 area[11]=23 5 area[13]=37 6 area[51]=UFOs 7 8 # 数组成员不一定非得是相邻或连续的. 9 10 # 数组的部分成员可以不被初始化. 11 # 数组中允许空缺元素. 12 # 实际上, 保存着稀疏数据的数组("稀疏数组") 13 #+ 在电子表格处理软件中是非常有用的. 14 15 16 echo -n "area[11] = " 17 echo ${area[11]} # 需要{大括号}. 18 19 echo -n "area[13] = " 20 echo ${area[13]} 21 22 echo "Contents of area[51] are ${area[51]}." 23 24 # 没被初始化的数组成员打印为空值(null变量). 25 echo -n "area[43] = " 26 echo ${area[43]} 27 echo "(area[43] unassigned)" 28 29 echo 30 31 # 两个数组元素的和被赋值给另一个数组元素 32 area[5]=`expr ${area[11]} + ${area[13]}` 33 echo "area[5] = area[11] + area[13]" 34 echo -n "area[5] = " 35 echo ${area[5]} 36 37 area[6]=`expr ${area[11]} + ${area[51]}` 38 echo "area[6] = area[11] + area[51]" 39 echo -n "area[6] = " 40 echo ${area[6]} 41 # 这里会失败, 是因为不允许整数与字符串相加. 42 43 echo; echo; echo 44 45 # ----------------------------------------------------------------- 46 # 另一个数组, "area2". 47 # 另一种给数组变量赋值的方法... 48 # array_name=( XXX YYY ZZZ ... ) 49 50 area2=( zero one two three four ) 51 52 echo -n "area2[0] = " 53 echo ${area2[0]} 54 # 阿哈, 从0开始计算数组下标(也就是数组的第一个元素为[0], 而不是[1]). 55 56 echo -n "area2[1] = " 57 echo ${area2[1]} # [1]是数组的第2个元素. 58 # ----------------------------------------------------------------- 59 60 echo; echo; echo 61 62 # ----------------------------------------------- 63 # 第3个数组, "area3". 64 # 第3种给数组元素赋值的方法... 65 # array_name=([xx]=XXX [yy]=YYY ...) 66 67 area3=([17]=seventeen [24]=twenty-four) 68 69 echo -n "area3[17] = " 70 echo ${area3[17]} 71 72 echo -n "area3[24] = " 73 echo ${area3[24]} 74 # ----------------------------------------------- 75 76 exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>Bash允许把变量当成数组来操作, 即使这个变量没有明确地被声明为数组. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 string=abcABC123ABCabc 2 echo ${string[@]} # abcABC123ABCabc 3 echo ${string[*]} # abcABC123ABCabc 4 echo ${string[0]} # abcABC123ABCabc 5 echo ${string[1]} # 没有输出! 6 # 为什么? 7 echo ${#string[@]} # 1 8 # 数组中只有一个元素. 9 # 就是这个字符串本身. 10 11 # 感谢, Michael Zick, 指出这一点. </PRE></FONT></TD></TR></TABLE> 类似的示范可以参考<AHREF="untyped.html#BVUNTYPED">Bash变量是无类型的</A>. </P></TD></TR></TABLE></DIV><DIVCLASS="EXAMPLE"><HR><ANAME="POEM"></A><P><B>例子 26-2. 格式化一首诗</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # poem.sh: 将本书作者非常喜欢的一首诗, 漂亮的打印出来. 3 4 # 诗的行数(单节). 5 Line[1]="I do not know which to prefer," 6 Line[2]="The beauty of inflections" 7 Line[3]="Or the beauty of innuendoes," 8 Line[4]="The blackbird whistling" 9 Line[5]="Or just after." 10 11 # 出处. 12 Attrib[1]=" Wallace Stevens" 13 Attrib[2]="\"Thirteen Ways of Looking at a Blackbird\"" 14 # 这首诗已经是公共版权了(版权已经过期了). 15 16 echo 17 18 for index in 1 2 3 4 5 # 5行. 19 do 20 printf " %s\n" "${Line[index]}" 21 done 22 23 for index in 1 2 # 出处为2行. 24 do 25 printf " %s\n" "${Attrib[index]}" 26 done 27 28 echo 29 30 exit 0 31 32 # 练习: 33 # ----- 34 # 修改这个脚本, 使其能够从一个文本数据文件中提取出一首诗的内容, 然后将其漂亮的打印出来. </PRE></FONT></TD></TR></TABLE><HR></DIV><P>数组元素有它们独特的语法, 甚至标准Bash命令和操作符, 都有特殊的选项用以配合数组操作. </P><DIVCLASS="EXAMPLE"><HR><ANAME="ARRAYOPS"></A><P><B>例子 26-3. 多种数组操作</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # array-ops.sh: 更多有趣的数组用法. 3 4 5 array=( zero one two three four five ) 6 # 数组元素 0 1 2 3 4 5 7 8 echo ${array[0]} # 0 9 echo ${array:0} # 0 10 # 第一个元素的参数扩展, 11 #+ 从位置0(#0)开始(即第一个字符). 12 echo ${array:1} # ero 13 # 第一个元素的参数扩展, 14 #+ 从位置1(#1)开始(即第2个字符). 15 16 echo "--------------" 17 18 echo ${#array[0]} # 4 19 # 第一个数组元素的长度. 20 echo ${#array} # 4 21 # 第一个数组元素的长度. 22 # (另一种表示形式) 23 24 echo ${#array[1]} # 3 25 # 第二个数组元素的长度. 26 # Bash中的数组是从0开始索引的. 27 28 echo ${#array[*]} # 6 29 # 数组中的元素个数. 30 echo ${#array[@]} # 6 31 # 数组中的元素个数. 32 33 echo "--------------" 34 35 array2=( [0]="first element" [1]="second element" [3]="fourth element" ) 36 37 echo ${array2[0]} # 第一个元素 38 echo ${array2[1]} # 第二个元素 39 echo ${array2[2]} # 40 # 因为并没有被初始化, 所以此值为null. 41 echo ${array2[3]} # 第四个元素 42 43 44 exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><P>大部分标准<AHREF="string-manipulation.html#STRINGMANIP">字符串操作</A>都可以用于数组中. </P><DIVCLASS="EXAMPLE"><HR><ANAME="ARRAYSTROPS"></A><P><B>例子 26-4. 用于数组的字符串操作</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # array-strops.sh: 用于数组的字符串操作. 3 # 本脚本由Michael Zick所编写. 4 # 授权使用在本书中. 5 6 # 一般来说, 任何类似于${name ... }(这种形式)的字符串操作 7 #+ 都能够应用于数组中的所有字符串元素, 8 #+ 比如说${name[@] ... }或${name[*] ...}这两种形式. 9 10 11 arrayZ=( one two three four five five ) 12 13 echo 14 15 # 提取尾部的子串 16 echo ${arrayZ[@]:0} # one two three four five five 17 # 所有元素. 18 19 echo ${arrayZ[@]:1} # two three four five five 20 # element[0]后边的所有元素. 21 22 echo ${arrayZ[@]:1:2} # two three 23 # 只提取element[0]后边的两个元素. 24 25 echo "-----------------------" 26 27 # 子串删除 28 # 从字符串的开头删除最短的匹配, 29 #+ 匹配的子串也可以是正则表达式. 30 31 echo ${arrayZ[@]#f*r} # one two three five five 32 # 匹配将应用于数组的所有元素. 33 # 匹配到了"four", 并且将它删除. 34 35 # 从字符串的开头删除最长的匹配 36 echo ${arrayZ[@]##t*e} # one two four five five 37 # 匹配将应用于数组的所有元素. 38 # 匹配到了"three", 并且将它删除. 39 40 # 从字符串的结尾删除最短的匹配 41 echo ${arrayZ[@]%h*e} # one two t four five five 42 # 匹配将应用于数组的所有元素. 43 # 匹配到了"hree", 并且将它删除. 44 45 # 从字符串的结尾删除最长的匹配 46 echo ${arrayZ[@]%%t*e} # one two four five five 47 # 匹配将应用于数组的所有元素. 48 # 匹配到了"three", 并且将它删除. 49 50 echo "-----------------------" 51
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -