免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6318 | 回复: 10
打印 上一主题 下一主题

【急!】有关awk里split函数 && 将数组作为参数传入函数 的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-12 14:01 |只看该作者 |倒序浏览
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


多谢各位大虾!!!

论坛徽章:
1
水瓶座
日期:2013-11-04 13:16:13
2 [报告]
发表于 2011-05-12 14:29 |只看该作者
shell 不支持这种! 必须一个一个取

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 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
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-05-12 18:43 |只看该作者
回复 3# yinyuemi


    能解释下'${'$1[$i]} 中的'${'吗?

论坛徽章:
0
5 [报告]
发表于 2011-05-12 19:01 |只看该作者
回复 3# yinyuemi


    还有一个问题要请教:怎么样改变传入函数的数组元素的值?谢谢你!

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2011-05-13 01:02 |只看该作者
回复 5# krisy0102


能否给个例子描述一下你想把什么改变成什么?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2011-05-13 01:11 |只看该作者
回复 4# krisy0102


    echo '${'$1[$i]} 加单引号主要是解释$为字符串,或是理解为先不把${}的形式解释为一个数组,而是先去解释$1 和 $i
所以也可以写成 echo \${$1[$i]} 或 echo $\{$1[$i]}。

论坛徽章:
0
8 [报告]
发表于 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_数组的长度

论坛徽章:
0
9 [报告]
发表于 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'`      #不行

论坛徽章:
0
10 [报告]
发表于 2011-05-16 15:27 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP