【问题标题】:How to pick an object from a list at random in csh如何在csh中随机从列表中选择一个对象
【发布时间】:2015-09-11 15:35:54
【问题描述】:

正如标题所暗示的,我试图在我的 csh 脚本中从列表中随机选择一个对象。

到目前为止我所拥有的是:

set list = ( \
           "string1" \
           "string2" \
           "string3" \
           )

while [1] do
    random_object = "I picked ${list [$RANDOM % ${#list[@]} ] }"
    echo $random_object

    sleep 1 #test code so I can see it randomise 
done

我得到的只是“[1]:不匹配。”

有人有解决办法吗?

【问题讨论】:

  • 您的脚本几乎在每个语句中都是错误的。您的 while 循环无效,您使用 set 分配给 random_object$RANDOM 是 bash 的事情,而不是 csh,您访问列表/数组的方式也是 bash 的事情。唯一正确的东西是echosleep语句....
  • 所以我在寻找 csh 帮助时遇到了问题,并且(似乎错误地)假设 bash 是相似的。那么正确的写法是什么呢?

标签: csh


【解决方案1】:

您必须求助于一些标准的 UNIX 实用程序。

例如:

#!/bin/csh -f

set list = ( \
           "string1" \
           "string2" \
           "string3" \
           )
while (1)
  dd if=/dev/random of=/tmp/random count=1 bs=4 >& /dev/null
  set random_nr = `od -t u4 /tmp/random | awk '{print $2;}'`
  @ random_index = $random_nr % $#list + 1
  set random_object = "I picked $list[$random_index]"
  echo "$random_object ($random_nr)"
  sleep 1
end

【讨论】:

  • 以前从未使用过od;很整洁。在单独的答案中进行改进。
【解决方案2】:

主要是@fork2execve 的建议。但是,您可以进行一些简化。您不需要调用 awk,也不需要调用 dd;而且您不需要临时文件。你可以这样做:

set random_nr=`od -D -N1 -An /dev/urandom`

【讨论】:

  • 嗯,如果您希望脚本在所有(旧)UNIX 变体上运行,请小心使用这些“新”选项。 AIX 和 Solaris 很好,但 HP-UX 11.23 不支持-D,所以我建议您坚持使用-t u4。如果您需要支持 BSD 4.3,那么它不支持任何这些。
猜你喜欢
  • 2014-11-21
  • 2019-02-04
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2017-04-26
  • 1970-01-01
相关资源
最近更新 更多