检查单词是否已在列表中(Bash)

时间:2017-03-16 08:58:20

标签: bash if-statement

我正在编写一个小的bash脚本,我正在尝试测试一个新生成的单词已经在所有以前创建的单词的列表中。

这就是我现在正在使用的:

dict=("word1"... "word21") #there would be 21 words in here
prev_guesses=()

guess_creator() {
    guess=""
    for i in {1..5} ;
    do 
        guess_num=$( shuf -i 0-21 -n 1 )
        guess+="${dict[$guess_num]}"
    done

    # using recursion to take another guess

    if [ $guess (is in)  $prev_guesses] ; then
        guess_creator
    else 
        prev_guess+=($guess)
    fi

}

我也不确定递归是否在bash中如此工作。如果没有,我在这里问如何实际“破解”这段代码。想法是让这个函数每次运行时不断输出一个唯一的字符串,这样我以后可以在脚本中使用它。

我有三个问题:

  1. 如何将guess与列表prev_guesses进行比较并获得truefalse输出

  2. 如何将猜测的字符串附加到列表prev_guesses(我刚检查过它,它只是将字符串连接在一起,我需要一个像prev_guesses=("guess1" "guess2"...)这样的列表 - 我可能已经解决了这个问题最后的编辑。

  3. guess_creator中的这种递归是否有效?

2 个答案:

答案 0 :(得分:1)

  1. 在阵列的bash中没有类似的东西(Socowi关于使用关联数组的想法更好),你必须再次遍历列表,或者尝试使用grep或者东西

  2. 引用数组的所有元素,需要语法${prev_guesses[*]}

  3. 所以你可以连接像

    这样的东西
    prev_guesses=(${prev_guesses[*]} $guess)
    

    你的话语中的空格会使它变得更加复杂

    1. 应该这样做。但....
    2. 那是艰难的方式。如果你想避免重复猜测,最好在你拍摄时从阵列中取出每个猜测,这样你就无法重复猜测。

      更容易使用shuf命令来做所有事情

          guess=($( shuf -e ${dict[*]} -n 5))
      

      改变你的话并采取前五个

答案 1 :(得分:1)

关联数组

由于您只对以下列中的单词感兴趣吗?«但不按条​​目顺序排列,您可以使用关联数组(也称为字典或哈希映射)存储你的话。检查条目是否在这样的地图中非常快(时间复杂度 O (1)):

declare -A oldGuesses=([word1]= [word2]= [word3]=)
if [[ "${oldGuesses[$guess]+1}" ]]; then
    echo "$guess was already taken"
else 
    echo "$guess was not taken yet"
fi

您可以使用

dict添加条目
dict["newEntry"]=

不要担心空的右手边。地图通常用于存储键值对。这里我们只使用密钥([]内写的东西)。

完全避免猜测列表

你提到你想要暴力破解,而且这个名单可以增长到4M条目。我建议不要使用bash,但更多的是反对存储所有猜测(无论你使用的语言是什么)。

相反,以有序的方式列举所有可能的猜测:

您想要创建五个连接词的猜测吗? 只需创建五个for循环:

for w1 in "${dict[@]}"; do
  for w2 in "${dict[@]}"; do
    for w3 in "${dict[@]}"; do
      for w4 in "${dict[@]}"; do
        for w5 in "${dict[@]}"; do
          guess="$w1$w2$w3$w4$w5"
          # do something with your guess here
        done
      done
    done
  done
done

这种方法对旧方法的好处:

  • 不必存储4M猜测。
  • 每当做出新猜测时,不必搜索4M猜测。
  • 保证不会一遍又一遍地选择相同的猜测。
  • 在做出所有可能的猜测时终止。