问题描述
在多数高级语言中,从数组或列表中随机获取元素是很常见的事情。那么在 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