「Shell」- 从数组中,随机选择元素

问题描述

在多数高级语言中,从数组或列表中随机获取元素是很常见的事情。那么在 Shell 中,也不例外,我们也会遇到需要从数组中随机获取元素的需求。

该笔记将记录:在 Shell 中,如何从数组中随机获取元素。

注意事项

并不是每种 Shell 都支持数组,例如 Bash 支持数组,但是 Bourne Shell (sh) 并不支持数组。我们希望可以写出可移植性高的代码,因此我们不会针对特定 Shell 来编写代码。该笔记也将记录更加通用的方法(但是,代码可能会比较难看)。

如果我们的需求复杂、数组复杂,我们会使用 Python Perl 脚本来处理,而不会使用 Shell 处理。

适用于 Bourne shell 的脚本

# 08/04/2020

#!/bin/sh

list="aes aes-128 aes-192 salsa20 blowfish twofish cast5 3des tea xtea xor sm4"
set -- $list
shift $(expr $RANDOM % $#)
KCPTUN_CRYPT="$1"

echo $KCPTUN_CRYPT

set:将 $list 的值作为当前 Shell 参数,就好像在执行脚本时传入这些参数;
shift:“洗牌”。由于参数是不确定的,所以没人知道第一个参数将是谁,也就是我们要获取的参数;

# 02/15/2021

#!/bin/sh

a="\
111111111111111111111111111111F\n
2222222222222222222222222222222\n
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n
ccccccccccccccccccccccccccccccc\n
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"

count=$(echo -e $a | wc -l) # 行数
random_line_number=$(expr "${RANDOM}" % "${count}" + 1) # 目标行号
random_line=$(echo -e $a | awk 'NR=='${random_line_number}' {print;exit}') # 读取该行

echo $random_line

参考文献

linux – Arrays in Shell Script, not Bash – Stack Overflow