免费注册 查看新帖 |

Chinaunix

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

如何遍历bash数组? [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-20 13:54 |只看该作者 |倒序浏览
比方打印出所有的非空的元素以及下标。
我目前的方法是

  1. a_len=${#a[@]}
  2. for((count=0,i=0;count<a_len;i++))
  3. do
  4.        [ x"${a[$i]}" != x ] && echo $i : ${a[$i]} && let count+=1
  5. done
复制代码

也就是先得到数组的真实长度,然后按照下标自加上去挨个搜索
而awk中可以

  1. for (i in a)
  2.      print i,a[i]
复制代码

bash中可以吗?

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2008-01-20 14:17 |只看该作者
不行吧。

bash中的数组是真正数组,它的下标只能是大于等于0的整数。
awk中的数组是hash数组,它的下标可以是任意的字符。

论坛徽章:
0
3 [报告]
发表于 2008-01-20 14:37 |只看该作者
  1. for i in ${a[@]}; do
  2.     echo $i
  3. done
复制代码


不好意思,没看清题目,还要下标

[ 本帖最后由 seeLnd 于 2008-1-20 14:38 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-01-20 14:49 |只看该作者
你这是个死循环,为何还要个count
直接这样不是可以么,只是比普通的多个判断是否为空:
  1. for ((i=0;i<${#a[@]};i++)); do
  2. [ x"${a[i]}" != x ] && echo $i : ${a[i]}
  3. done
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2008-01-20 15:03 |只看该作者
原帖由 seeLnd 于 2008-1-20 14:49 发表
你这是个死循环,为何还要个count
直接这样不是可以么,只是比普通的多个判断是否为空:
for ((i=0;i

不是死循环,我已经测试过。不加count不行,
比方
a[0]=test1
a[1]=test2
a[8]=test8
我希望的输出结果是
0 : test1
1 : test2
8 : test8

论坛徽章:
0
6 [报告]
发表于 2008-01-20 15:09 |只看该作者
恩,是的,我明白你的意思了,但是在 a[2]="" 的情况下是死循环

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2008-01-20 15:12 |只看该作者
原帖由 seeLnd 于 2008-1-20 15:09 发表
恩,是的,我明白你的意思了,但是在 a[2]="" 的情况下是死循环

0长度的变量在shell里是不会被计入,也就是不影响${a[@]}的计算
a[0]=test

a[0]=test
a[1]=""
${a[@]}都等于1的

论坛徽章:
0
8 [报告]
发表于 2008-01-20 15:19 |只看该作者
~$ a[0]=test; a[1]=""; echo ${#a[@]}
2
~$ bash --version
GNU bash, version 3.2.33(1-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.

环境是cygwin,在家里,没有启动Linux,莫非cygwin不一样?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
9 [报告]
发表于 2008-01-20 15:26 |只看该作者
原帖由 seeLnd 于 2008-1-20 15:19 发表
~$ a[0]=test; a[1]=""; echo ${#a[@]}
2
~$ bash --version
GNU bash, version 3.2.33(1-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.

环境是cygwin,在家里,没有启 ...

奇怪,我几次测试的结果好象也不一样.......OMG
那我开始的代码也不可信了........
果然是计入的,可能是转了一圈,回来了,所以最终跳出循环........

[ 本帖最后由 cjaizss 于 2008-1-20 15:28 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2008-01-20 16:15 |只看该作者
看来如果用bash数组做hash table,只可以曲线救国了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP