在Bash中生成跟随特定模式的随机字符串的最佳方法

时间:2011-08-11 20:41:05

标签: linux string bash random

我想在这种模式下生成许多六个字符串:

  

[辅音] [元音] [辅音] [辅音] [元音] [辅音]

e.g。

  

haplop
  github上
  qursog

我已经看过各种各样的方法,但到目前为止,我所拥有的只是优雅。我的想法主要是围绕一次生成一个角色,但即便如此,由于我缺乏bash脚本知识和模糊的Linux命令,我的想法并不是那么好。

理想情况下,我正在寻找一个随机生成字符串的Linux命令,但允许我指定上面显示的模式(如果一个甚至存在)。或者,如果您知道在bash中执行此操作的简单方法,那也很棒。

提前致谢

编辑:顺便说一下,我会在选择接受的答案前24小时给出这个答案,这样我就有更多的机会选择最好的答案,而不仅仅是第一个(尽管第一个答案非常好)。

4 个答案:

答案 0 :(得分:14)

以下是生成元音的方法:

s=aeiou
p=$(( $RANDOM % 5))
c=${s:$p:1}

对辅音使用相同的方法。

你可以将它包装成一个小函数:

function vowel() {
    s=aeoiu
    p=$(( $RANDOM % 5))
    echo -n ${s:$p:1}
}

然后你有一个很好的模式来生成字符串:

s=`consonant; vowel; consonant; vowel; consonant; vowel`

答案 1 :(得分:2)

#!/bin/bash
#
#
cprint () {
    typ=$1
    case $typ in 
        v) alpha="aeiouy" ;;
        c) alpha="bcdfghjklmnpqrstvwxz" ;;
        V) alpha="AEIOUY" ;;        
        C) alpha="BCDFGHJKLMNPQRSTVWXZ" ;;
        n) alpha="0123456789" ;;
        *) echo "** Undefined **" ; exit 1 ;;
    esac
    len=${#alpha}
    r=$((RANDOM%len))
    echo -en ${alpha:r:1}
}

rprint () {
    code=$1
    for i in $(seq 1 ${#code})
    do 
        c=${code:i-1:1}
        cprint $c
    done
    echo
}

rprint "cvccvc"
rprint "cvcvvc"
rprint "Cvccvc"
rprint "Vccvcvc"
rprint "Cvnvn"

此解决方案很容易更改为打印不同的序列,很容易重新定义,如果您不同意y,需要äöü或UPPERCASE等。

实验结果:

gohhec
voteup
Wuwjut
Utpycoq
Va6a6
男人bash说RANDOM:

  

每次引用此参数时,都是0到32767之间的随机整数...

因此,如果取模RANDOM % X,而X不是2的幂,则较低的余数将比较高的余数更好。在您的情况下,它不应该很重要,只要您不使用角色组转到extereme,或在高安全性区域使用它。 :)

答案 2 :(得分:1)

对于后代,我将包括我最终的代码。它主要使用Karoly Horvath的代码,但我还添加了一些来自“用户未知”的想法:

#!/bin/bash
function v() {
    s=aeoiuy
    p=$((RANDOM % ${#s}))
    echo -n ${s:$p:1}
}

function c() {
    s=bcdfghjklmnpqrstvwxz
    p=$((RANDOM % ${#s}))
    echo -n ${s:$p:1}
}

function genPatternStrings() {
    for i in $(eval echo {0..$1}); do
        echo `c;v;c;c;v;c;`
    done
}

genPatternStrings $1;

答案 3 :(得分:1)

虽然以下命令不回答原始问题,但在其他情况下生成任何随机字符串可能很有用:

for i in {1..15}; do     # 15 random strings
    dd status=noxfer if=/dev/random bs=1 count=200 2>/dev/null |
    tr -dc 'a-z0-9A-Z' | # alphanumerics only
    cut -b1-10 |         # length 10
    tr 'A-Z' 'a-z'       # lowercase
done | less