Chinaunix

标题: 【急!】有关awk里split函数 && 将数组作为参数传入函数 的问题 [打印本页]

作者: krisy0102    时间: 2011-05-12 14:01
标题: 【急!】有关awk里split函数 && 将数组作为参数传入函数 的问题
1.

     echo ${f[*]}|awk '{ print split($0,F," ") }'

     为什么
   
      echo ${F[*]}

      输出为空?
      split划分出的数组只能在awk语句里面使用吗?能不能进行数组复制,比如说  array=(${F[*]}) ?


2.

     怎么样将数组作为参数传入函数?

     add_arr()
{
        i=0
        sum=0
        while [ $i -lt "$2" ]
        do
                sum=`expr $sum+ ${$1[$i]}`
                let i++
        done
        echo "sum=$sum"
}

add_arr "${F[*]}" $num


多谢各位大虾!!!
作者: howge    时间: 2011-05-12 14:29
shell 不支持这种! 必须一个一个取
作者: yinyuemi    时间: 2011-05-12 14:58
本帖最后由 yinyuemi 于 2011-05-12 15:42 编辑

回复 1# krisy0102


    1. awk 的数组不能拿出来用,可以这样:
  1. echo ${f[*]} |awk '{l=split($0,a," ");for(i=1;i<l;i++) s=s" "a[i];print "eval F=("s a[l]")"}' |sh
复制代码
2. 试试这样:
  1. cat sh.txt

  2. F=(1 2 3 4 5)

  3. add_arr()
  4. {
  5.         i=0
  6.         sum=0
  7.         while [ $i -lt "$2" ]
  8.         do
  9.                 sum=$(($sum+$(eval echo '${'$1[$i]})))
  10.                 let i++
  11.         done
  12.         echo "sum=$sum"
  13. }

  14. add_arr $1 $2


  15. ./sh.txt F 4
  16. sum=10
复制代码

作者: krisy0102    时间: 2011-05-12 18:43
回复 3# yinyuemi


    能解释下'${'$1[$i]} 中的'${'吗?
作者: krisy0102    时间: 2011-05-12 19:01
回复 3# yinyuemi


    还有一个问题要请教:怎么样改变传入函数的数组元素的值?谢谢你!
作者: Shell_HAT    时间: 2011-05-13 01:02
回复 5# krisy0102


能否给个例子描述一下你想把什么改变成什么?
作者: yinyuemi    时间: 2011-05-13 01:11
回复 4# krisy0102


    echo '${'$1[$i]} 加单引号主要是解释$为字符串,或是理解为先不把${}的形式解释为一个数组,而是先去解释$1 和 $i
所以也可以写成 echo \${$1[$i]} 或 echo $\{$1[$i]}。
作者: krisy0102    时间: 2011-05-13 09:02
回复 6# Shell_HAT

  1. # Include_or_Not
  2. # Input:  $1: FLAG_                $2: CHECK_                $3: NF_                $4:                 $5: one line from input file
  3. # Output:   none

  4. Include_or_Not()
  5. {
  6.         nf_=$3
  7.         i=0        

  8.                         while [ i -lt $nf_ ]
  9.                         do
  10.                                 check_=$(eval echo '${'$2[$i]})
  11.                           str=`grep "$check_" $5`               
  12.                     if [ -z  "$str"];then
  13.                             continue            
  14.                     else   
  15.                 #      flag_[$i]=1  
  16.                     fi          
  17.                     let i++
  18.                         done       

  19. }
复制代码
Include_or_Not:在输入文件中按行查找若干字符串,这些字符串放在CHECK_数组中,比如说CHECK_[0]="a"、CHECK_[0]="b"、CHECK_[0]="c",
找到的话就将FLAG_数组中的对应位置置1.NF_表示CHECK_数组的长度
作者: krisy0102    时间: 2011-05-13 16:24
回复 6# Shell_HAT


    还有一个问题,sed中如何通过包含正则表达式的变量来进行匹配?

    比如


    #!/bin/sh

   mode="username .* password 1 .*"
   s="username cupcenter password 1 030sadkljflkwjej84B1B"

   t1=`echo "$s"|grep "$mode"`             #可以找出

   t2=`echo "$s"|sed -n '/'$mode'/p'`      #不行
作者: krisy0102    时间: 2011-05-16 15:27

作者: yuloveban    时间: 2011-12-05 21:31
awk  'BEGIN{for(i=1;i<=255;i++){for(a=0;a<=3;a++){print "192.168."a"."i}}}'




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