【问题标题】:Generate strings of varying in boundaries with bash script使用 bash 脚本生成边界不同的字符串
【发布时间】:2020-05-25 15:44:09
【问题描述】:

我想用我的 bash 脚本生成长度在 1-4 之间的字符串。我知道如何创建具有设定长度的字符串,但想知道是否对以下命令进行了细微更改以使其在 1-4 长度之间进行选择。

cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 4

这将创建标准长度为 4 的数字/字母字符串。有什么方法可以调整它以满足我的需要?

【问题讨论】:

    标签: string bash random


    【解决方案1】:

    不是最聪明的解决方案,但我猜这应该可行

    cat /dev/urandom | tr -dc A-Za-z0-9 | head -c "$(shuf -i 1-4 -n 1)"
    

    【讨论】:

    • 应该可以,但是因为我的程序已经需要大约 10 秒才能完成我想要它做的事情,我担心在这里添加另一个随机函数可能会比我想要的更多地增加执行时间。真的希望有一个我不知道的修复方法,基于改变“head..”部分。
    • 没用的cat。还可以使用字符类和切换语言环境以获得跨系统的一致结果:LC_ALL=POSIX tr -dc '[:alnum:]' </dev/urandom | head -c "$(shuf -i 1-4 -n 1)"
    【解决方案2】:

    这很简单:使用随机数/字符生成器来生成head -c 的参数。

    bash 中,您可以将内置变量$RANDOM 与算术表达式一起使用。随机数不是很好(尤其是在使用% someBigNumber 时)但对于大多数情况来说已经足够了:

    < /dev/urandom tr -dc A-Za-z0-9 | head -c "$((RANDOM % 4 + 1))"
    

    如果您需要更好的随机性或可移植脚本,请再次使用 /dev/urandom

    < /dev/urandom tr -dc A-Za-z0-9 | head -c "$(< /dev/urandom tr -dc 1-4 | head -c 1)"
    

    【讨论】:

      【解决方案3】:

      这里是生成n个随机最小长度到最大长度的随机字符串的方法:

      它读取随机[:alnum:]字母数字字符流;每次使用不同的随机数,并将其存储在一个数组中。

      此方法通过以下方式最大限度地提高效率:

      • Bash 内置函数的使用。
      • 单个调用外部命令tr
      • /dev/urandom 快速随机生成器设备中读取随机无符号字节。
      #!/usr/bin/env bash
      
      # count: Number of strings to generate
      # l_min: Minimum length of string
      # l_max: Maximum length of string
      
      declare -i count=10 l_min=4 l_max=8
      
      # Array containing random strings
      
      declare -a rand_strings=()
      
      declare -i i=0
      while [ $i -lt $count ]; do
        declare -i l=$((RANDOM%(l_max-l_min+1)+l_min))
        read -r -N $l rand_strings[i]
        i=$((i+1))
      done < <(
        LC_ALL=POSIX
        tr -dc '[:alnum:]' </dev/urandom
      )
      
      printf '%d ranndom strings of %d to %d characters\n' $count $l_min $l_max
      printf '%q\n' "${rand_strings[@]}"
      

      样本输出:

      10 ranndom strings of 4 to 8 characters
      4QeeD9oT
      GZQ7dD0
      r3wb5D
      17HBZhp
      SP1i
      t1OHq
      1L4qpz7T
      F5zG
      Dw9HQ
      ysG2chf
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        • 2021-12-26
        • 2013-11-16
        • 1970-01-01
        • 1970-01-01
        • 2022-07-21
        • 2021-09-11
        相关资源
        最近更新 更多