免费注册 查看新帖 |

Chinaunix

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

搞不定shell数组中的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-08 17:14 |只看该作者 |倒序浏览
以下脚本是想让输出结果的每一行由一个数组来存储
count=0
ls /home/user/ | while read line
do
echo $line
array[$count]=$line
echo $count
echo ${array[$count]}
((count++))
done
echo ${array[0]}
echo ${array[1]}

假设ls /home/user/ 的输出是123.txt abc.txt
但是输出却是:
123.txt   <--echo $line输出,符合预想
0
123.txt   <-echo ${array[$count]} 输出,符合预想
abc.txt   <--echo $line输出,符合预想
1
abc.txt  
          <---echo ${array[0]}的输出竟然是空行,为什么不是123.txt?
          <---echo ${array[1]}的输出竟然是空行,为什么不是abc.txt?

这个搞不定啊,请各位高手不吝赐教,谢谢!

论坛徽章:
0
2 [报告]
发表于 2007-02-08 17:28 |只看该作者
试试${array["0"]}${array["1"]}
还有在我这里按照你的脚本也能正确执行的.

[ 本帖最后由 Iambitious 于 2007-2-8 17:31 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-02-08 17:31 |只看该作者
  1. count=0
  2. ls /home/user/ | { while read line
  3. do
  4. echo $line
  5. array[$count]=$line
  6. echo $count
  7. echo ${array[$count]}
  8. ((count++))
  9. done
  10. echo ${array[0]}
  11. echo ${array[1]}
  12. }
复制代码

ksh93的话,楼主的代码没问题。
bash就需要用code block技术或者用重定向来解决while read陷阱了。

[ 本帖最后由 一梦如是 于 2007-2-8 17:33 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-02-08 17:32 |只看该作者
oh我明白了,你的array是在子shell里面给的值。

论坛徽章:
0
5 [报告]
发表于 2007-02-08 17:40 |只看该作者
首先非常感谢一梦如是和Iambitious两位老大!
按照Iambitious老大的方法好象不行啊
一梦如是老大能否解释一下是什么原因导致我的脚本不能正常运行吗?如果您们还没下班的话
谢谢!

论坛徽章:
0
6 [报告]
发表于 2007-02-08 17:49 |只看该作者
我的方法是错误的。

论坛徽章:
0
7 [报告]
发表于 2007-02-08 17:51 |只看该作者
在bash中,一个pipeline(也就是有管道的命令行),shell会同时fork两个进程,分别执行管道两边的代码,这两个进程自然是当前进程(此当前进程指的是shell脚本起的进程)的子进程。您那段代码,从ls到done是一个pipeline,因此while到done这段代码是在一个子进程中执行的,而数组也是在子进程赋值的。最后两句echo却是在当前进程执行的,父进程自然无法直接继承子进程的变量,因此打印不出来。
ksh93起,pipeline的管道后的代码会在当前进程执行,因此就不会出现while read陷阱了。
我写的代码使用的技巧叫code blocks,有兴趣可以研究ABS
http://www.linuxsir.org/main/doc/abs/abs3.7cnhtm/index.html

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
8 [报告]
发表于 2007-02-08 18:50 |只看该作者
提供另一个方法:

  1. oIFS=$IFS; IFS=$'\n'   # 防止变量名中有空白符。
  2. array=(`ls /home/user`)
  3. IFS=$oIFS
复制代码

论坛徽章:
0
9 [报告]
发表于 2007-02-08 22:36 |只看该作者
对楼上各位致以最崇高的敬意!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP