Chinaunix

标题: 一维数组(译) [打印本页]

作者: gzgzgz    时间: 2005-04-14 22:51
标题: 一维数组(译)
为感谢ChinaUnix上兄弟的无私帮助,我贡献一段关于shell数组的翻译,不足之处望大家海涵,海纳百川,有容乃大,希望大家尽己所能,发挥自由之精神。

bash提供一维数组。使用一个数组前可以显式地以declare声明(言下之意,也可以不)。在数组元素的最大数目上并无约束,甚至,不要求数组元素被连续赋值。其下标从0开始。

一个数组可以通过如下赋值方式而自动创建:
name[subscript]=value
下标subscript必须为数,大于或等于0,显式声明如下:
declare -a name
为自己方便,也可写成
declare -a name[subscript],shell解释时忽略subscript.

用如下方式可对整个数组赋值
name=(value1 ... valuen)

其中value可用[subscript]=代替,从而具体指定对那个元素赋值。例子如下:

[shark@phi ver1.2]$ name=([0]=1 [2]=34 [3]=45)
[shark@phi ver1.2]$ echo ${name[0]}
1
[shark@phi ver1.2]$ echo ${name[1]}

[shark@phi ver1.2]$ echo ${name[2]}
34
[shark@phi ver1.2]$ echo ${name[3]}
45
[shark@phi ver1.2]$ echo ${name[4]}

[shark@phi ver1.2]$
(不过这样太不方便,个人意见,还不如按下标一个个写)
引用数组变量用
${name[subscript]}
必须用{},否则shell将有误解,而不予接受。

若下标为`@' or `*', 则做通配符解,代指所有数组元素。
[shark@phi ver1.2]$ echo ${name
  • }
    1 34 45
    [shark@phi ver1.2]$
    [shark@phi ver1.2]$ echo ${name[@]}
    1 34 45

    但不可做赋值
    name
  • =1    是错的。

    数组元素可以是字符串。元素间以环境变量IFS的第一个字符分隔。

    [shark@phi ver1.2]$ name=(hello glad to meet you)
    [shark@phi ver1.2]$ echo ${name[0]}
    hello
    [shark@phi ver1.2]$ echo ${name[1]}
    glad
    [shark@phi ver1.2]$ echo ${name[2]}
    to
    [shark@phi ver1.2]$ echo ${name[3]}
    meet
    [shark@phi ver1.2]$ echo ${name[4]}
    you

    若要跨过分隔约束,用双引号括起
    [shark@phi ver1.2]$ name=("hello glad" to meet you)
    [shark@phi ver1.2]$ echo ${name[0]}
    hello glad
    [shark@phi ver1.2]$ echo ${name[1]}
    to
    [shark@phi ver1.2]$ echo ${name[2]}
    meet
    [shark@phi ver1.2]$ echo ${name[3]}
    you

    数组元素个数以${#name[subscript]} 计得
    无下标的数组变量引用等价于引用其第零个元素。
    用unset命令可以销毁一个数组
    unset name    或者   unset name

  • 也可以只销毁一个元素
    unset name[subscript]

    read命令支持以 -a 参数从标准输入读入数组。
    作者: 寂寞烈火    时间: 2005-04-14 22:58
    标题: 一维数组(译)
    try:
    array=($(<filename))
    作者: gzgzgz    时间: 2005-04-14 23:12
    标题: 一维数组(译)
    a=` find ~/ -name "*.gz" `
    b=($a)
    作者: 寂寞烈火    时间: 2005-04-14 23:37
    标题: 一维数组(译)
    原帖由 "gzgzgz" 发表:
    a=` find ~/ -name "*.gz" `
    b=($a)

    能一句解决的为什么要用两句?

    1. array=($(find /path -name "*.gz"))
    复制代码






    欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2