免费注册 查看新帖 |

Chinaunix

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

[Linux] 【急】以下为什么只输出10个一样的结果,怎样输出10个随机不同的结果啊 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-08 21:50 |只看该作者 |倒序浏览
array_var[0]="0000"
array_var[1]="0001"
array_var[2]="0002"
array_var[3]="0003"
array_var[4]="0004"


awk 'BEGIN"{
for (i=0;i<10;++i)
{
printf "'"${array_var[$((RANDOM%5))]}"'\n",i
}
}'/dev/null > ./$filename_out

求解以上shell,为什么每次执行都是输出10个一模一样的值,我想随机输出10个值,该怎么实现

论坛徽章:
0
2 [报告]
发表于 2012-11-09 07:55 |只看该作者
没人啊:'(:'(:'(:'(

论坛徽章:
0
3 [报告]
发表于 2012-11-09 22:55 |只看该作者
现在没用linux,也没办法man random。
就凭记忆说下。
我记得在C中 random就是个伪随机函数。
如果想得到一个真正的随机值,那就得给它一个特别的参数。比如当前具体的时间什么的。
bash上估计也是如此,SO......

论坛徽章:
0
4 [报告]
发表于 2012-11-11 21:42 |只看该作者
一样的,我试过,使用时间然后搞出一个随机数,结果与上面的RANDOM输出结果一样//回复 3# hstking


   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
5 [报告]
发表于 2012-11-11 21:53 |只看该作者
你要搞清楚原理, shell解析shell脚本, 脚本里定义了一个数组, 执行到awk命令的时候, 发现PATH路径里可以找到awk程序, 于是就启动子进程执行awk程序, 怎么执行的呢?

awk 'BEGIN"{
for (i=0;i<10;++i)
{
printf "'"${array_var[$((RANDOM%5))]}"'\n",i
}
}'

你看到了, 你不知不觉中执行了一个外部程序awk, 第一个命令行参数(argv[1])是一个'BEGIN"{....}', 可以看到你用单引号包裹了第一个命令行参数, 因为你不希望shell解析与替换里面的任何内容, 导致了什么呢? ${array_var[$((RANDOM%5))]} 这堆东西就原原本本的进入了argv[1], awk解析这一句话的时候遇见了这么一行东西:
${array_var[$((RANDOM%5))]}, 它根本不知道array_var是个毛, $是个毛, 它不懂的, 你理解了吗?

所以, 请用awk "", 即双引号传递一个命令行参数, 那么shell会先解析里面的内容再启动awk程序, 于是就, 你懂了.

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2012-11-11 22:36 |只看该作者
  1. [root@vps616 shell]# sh main.sh
  2. 0000
  3. 0000
  4. 0004
  5. 0001
  6. 0002
  7. 0002
  8. 0003
  9. 0002
  10. 0003
  11. 0004
  12. [root@vps616 shell]# cat main.sh
  13. #!/bin/bash


  14. array_var[0]="0000"
  15. array_var[1]="0001"
  16. array_var[2]="0002"
  17. array_var[3]="0003"
  18. array_var[4]="0004"

  19. awk -v arr_len=${#array_var[@]} 'BEGIN{srand(systime());for(i=0;i<10;++i){print ARGV[int(rand()*arr_len)+1];}}' ${array_var[@]}
  20. [root@vps616 shell]# sh main.sh  
  21. 0002
  22. 0003
  23. 0001
  24. 0000
  25. 0000
  26. 0003
  27. 0004
  28. 0004
  29. 0004
  30. 0002
复制代码
给你个例子.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP