LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1929|回复: 7

如何在shell编程中使用数组?[欢迎讨论]

[复制链接]
发表于 2003-7-9 18:10:36 | 显示全部楼层 |阅读模式
粗粗翻了一遍Linux/Unixshell编程指南的电子书,除了在awk命令那里看到一点和数组相关的资料,没找到别的地方介绍。

要求把硬盘上所有ext2分区进行一次检查,计划开头这样做:

N=0

fdisk -l /dev/hda | grep "83  Linux" | awk '{print $1}' >tempfile
while read LINE[N]
   N=$N+1
done <tempfile        

能不能用LINE[N],是不是预先要做什么定义?
发表于 2003-7-9 18:52:00 | 显示全部楼层
在shell中,是可以很好的应用数组的!
在ksh中,是可以定义和引用数组的,如:
$set -A arg a b c        //定义一个数组arg,他包含三个元素,下标以0开始
$echo ${arg
  • }       //显示数组arg的全部元素
    a b c
    $echo ${#arg
  • }       //显示数组arg的元素个数
    3
    $echo ${arg[2]}       //显示其中下标为2的元素
    c

    在脚本中使用数组的例子
    #!/bin/ksh
    #
    #将命令行参数传递到数组arg.
    (($#<2)) && { echo "eror!";exit 1; }
    set -A arg $*
    echo "所有数组元素: ${arg
  • }"
    echo "第二个元素: ${arg[2]}"
    echo "元素个数: ${#arg
  • }"
  • 发表于 2003-7-9 19:07:05 | 显示全部楼层
    要求把硬盘上所有ext2分区进行一次检查,计划开头这样做:

    N=0

    fdisk -l /dev/hda | grep "83 Linux" | awk '{print $1}' >tempfile
    while read LINE[N]
    N=$N+1
    done <tempfile

    能不能用LINE[N],是不是预先要做什么定义?
    read命令在while循环中已经自动的从第一行读到最后行的,用LINE[N]是没有意义而且是错误的!
    如:
    [root//root]fdisk -l /dev/hda|grep "83"|awk '{print $1}' >tmp
    [root//root]while read line;do echo $line;done <tmp
    就可以满足你的要求呀!;)
    发表于 2003-7-10 02:09:04 | 显示全部楼层
    很遗憾,开版至今也没有对数组作详细的讨论...看来是时候啦~~;)
    发表于 2003-7-10 08:59:47 | 显示全部楼层
    bash里面
    定义
    declare -a myarray;
    赋值
    myarray[0]=0;
    myarray[1]=1;
    .............
    引用数值
    j=1
    somevar=${myarray[$j]}
    #somevar=myarray[1]=1
     楼主| 发表于 2003-7-10 10:33:52 | 显示全部楼层

    使用数组,仍然存在问题

    现在的程序是这样的:
    #!/bin/sh

    declare -a myarray
    N=0
    fdisk -l /dev/hda | grep "83  Linux" | awk '{print $1}' >temp

    while read LINE
    do
      myarray[$N]=$LINE
      N=`expr $N + 1 `
      echo $N
      echo ${myarray[$N]}
    done<temp
    export myarray

    执行结果很奇怪,是
    1
    bash: /dev/hda3: Permission denied
    2
    bash: /dev/hda4: Permission denied
    3
    ...


    执行之后,echo ${myarray[2]},结果为空
    而temp文件没有问题,是
    /dev/hda3
    /dev/hda4
    ...
    /dev/hda12
     楼主| 发表于 2003-7-10 11:32:25 | 显示全部楼层

    已经解决问题了

    编辑的时候多敲了几个空格。

    现在的程序是这样的:
    #!/bin/sh

    declare -a myarray
    N=0
    fdisk -l /dev/hda | grep "83 Linux" | awk '{print $1}' >temp

    while read myarray[$N]
    do
    N=`expr $N + 1 `
    echo $N
    echo ${myarray[$N]}
    done<temp
    export myarray N
    发表于 2003-7-10 12:38:55 | 显示全部楼层
    在BASH中,也可以这样声明一个数组的,
    $arg=(one two three four)
    $echo ${arg
  • }
    one two three four
    $echo ${arg[2]}
    three
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表