【问题标题】:bash shell pull all values from array in random order. Pull each value only oncebash shell 以随机顺序从数组中提取所有值。每个值只拉一次
【发布时间】:2021-03-09 21:42:24
【问题描述】:
我需要以随机顺序从数组中提取值。它不应该两次提取相同的值。
R=$(($RANDOM%5))
mixarray=("I" "like" "to" "play" "games")
echo ${mixarray[$R]}
我不确定在上面的代码之后该怎么做。我想把第一个拉取的值放到另一个数组中,然后将它全部嵌套在一个循环中,检查第二个数组,这样它就不会从第一个数组中两次拉取相同的值。经过多次尝试,我就是无法正确使用语法。
输出应该是这样的:
到
喜欢
一世
玩
游戏
谢谢,
【问题讨论】:
标签:
arrays
bash
loops
random
【解决方案1】:
请您尝试以下方法:
#!/bin/bash
mixarray=("I" "like" "to" "play" "games")
mapfile -t result < <(for (( i = 0; i < ${#mixarray[@]}; i++ )); do
echo -e "${RANDOM}\t${i}"
done | sort -nk1,1 | cut -f2 | while IFS= read -r n; do
echo "${mixarray[$n]}"
done)
echo "${result[*]}"
- 首先,它并排打印一个随机数和一个从 0 开始的索引。
- 上面的过程会重复
mixarray的长度。
- 输出将如下所示:
13959 0
6416 1
6038 2
492 3
19893 4
492 3
6038 2
6416 1
13959 0
19893 4
- 现在第二个字段中的索引是随机的。该字段是用
cut 命令。
- 接下来使用随机索引重新排列
mixarray 的元素。
- 最后将输出分配给数组
result 并打印出来。