如何在声明的数组中使用RANDOM命令

时间:2016-04-08 05:13:56

标签: arrays bash password-generator

我正在尝试构建一个脚本,我需要使用以下参数创建密码生成器:

  • 必须至少8个字符,但不得超过16个字符。
  • 必须至少包含1位数字(0-9)。
  • 必须包含至少1个小写字母。
  • 必须包含至少1个大写字母。
  • 必须只包含@ # $ % & * + - =中的一个且仅一个

我有两个想法:

第一个:

#!/bin/bash
#
#Password Generator 
#
#

Upper=('A''B''C''D''E''F''G''H''I''J'K''L''M''N''O''P''Q''R''S''T''U''V''W''X''Y''Z')
Lower=('a''b''c''d''e''z''f''g''h''i''j''k''l''m''o'''p''q''r''s''t''u''v''w''x''y''z')
Numbers=('1''2''3''4''5''6''7''8''9')
SpecialChar=('@''#''$''%''&''*''+''-''=')



if [ S# -eq 0 ] ; then 


Pwlength=`shuf -i 8-16 -n 1` 

Password=`< /dev/urandom tr -dc A-Za-z0-9$SpecialChar | head -c $Pwlength` 

echo "Random Password is being generated for you"

sleep 5

echo "Your new password  is : $Password"


exit

问题是我得到的字符甚至没有定义?

这个想法:

for((i=0;i<4;i++)) 

do

password=${Upper[$random % ${#Lower[@]} ] }
password=${Upper[$random % ${#Upper[@]} ] }
password=${Upper[$random % ${#Number[@]} ] }
password=${Upper[$random % ${#SpecialChar[@]} ] }

done

由于某些原因,他们没有工作; /

2 个答案:

答案 0 :(得分:0)

在您的第一个示例中,移动&#34; - &#34;字符到SpecialChar的结尾。我认为你所拥有的定义会导致允许&#34; +&#34;到&#34; =&#34; (即,传递给tr的值读作&#34; + - =&#34;),它代表了你不期望的字符。或者,替换&#34; - &#34;用&#34; _&#34;。

So, try a definition like:
SpecialChar=('@''#''$''%''&''*''+''=''-')

答案 1 :(得分:0)

您的首次尝试存在以下问题:

  • 您正在使用数组来包含单个字符串。粘贴'A''B''C'相当于'ABC'。简单地将这些转换为标量变量可能是最简单的修复。
  • 你不是quoting your variables
  • 您声明UpperLowerNumbers,但从不使用它们。
  • 将变量用于你曾经使用过一次(或更少:-)的东西,无论如何都是可疑的。
  • 如@KevinO所述,短划线在tr中具有特殊含义,如果您想要字面上匹配,则需要是第一个或最后一个。

最重要的是,sleep 5似乎没有任何有用的用途,如果还没有,它会开始惹恼你。如果你真的想要一台较慢的电脑,我相信这里有人愿意交易。

您的第二次尝试存在以下问题:

  • Bash中的特殊变量$RANDOM拼写为全部大写。
  • 您正在尝试对(未引用的!)字符数组进行模运算,这些字符数组没有明确定义。 %之后的除数需要是一个整数。你可以将字符代码转换为整数,但这有点痛苦,而且你对结果的期望还不够明确。

快速尝试修复第一次尝试将是

Password=$(< /dev/urandom tr -dc 'A-Za-z0-9@#$%&*+=-' | head -c $(shuf -i 8-16 -n 1))

如果要验证生成密码的某些属性,我仍然不明白为什么需要数组。

while read -r category expression; do
    case $Password in
      *[$expression]*) continue;;
      *) echo "No $category"; break;;
    esac
done <<'____HERE'
    lowercase a-z
    uppercase A-Z
    numbers   0-9
    specials  -@#$%&*+=
HERE