【问题标题】:Char by Char looping replacing in BASHChar by Char 循环替换 BASH
【发布时间】:2015-04-12 20:12:39
【问题描述】:

所以我做了一小段代码,应该用另一个字符串中的字符替换下划线 (_)。如果你想知道目的,我打算制作刽子手游戏。

x=0
while [ $x -lt $LengthOfAnswer ]; do
  if [ $Answer:$x:1 == $GuessedChar ]; then
    Underscores=$( echo $Underscores | sed s/_/${Answer:$x:1}/$((x+1)) )
  fi
done

由此产生的结果是,第一次进行猜测时,这个循环就会结束,一切都按预期进行。 然而,在那之后,结果开始出现奇怪的模式。

例子:

答案是“abcdef”

开始:“_ _ _ _ _ _”

猜“a”:“a _ _ _ _ _”

猜“b”:“a _ b _ _ _”

猜“c”:“a_b_c_”

当然,此时应该是“a b c _ _ _”

如果有人对需要做些什么来完成这项工作有任何建议,我很乐意听到。如果除了改变我的结构别无选择,请告诉我。

【问题讨论】:

  • 你可以找到一个用 bash 制作的刽子手游戏的实现 here
  • 嗯,我的大学正在进行一项评估,我们都需要制作 Hangman 来测试我们的 bash 技能。从结构上讲,这很容易,但这里的语言本身是最容易遇到的障碍。

标签: linux string bash loops replace


【解决方案1】:

这要归功于 higuaro,附上他的链接; Hangman Example

额外的上下文帮助我弄清楚了这一点,得出了以下解决方案:

x=0
while [ $x -lt $LengthOfAnswer ]; do
  if [ $Answer:$x:1 == $GuessedChar ]; then
    Underscores="${Underscores:0:$x}$GuessedChar${Underscores:$((x+1))}"
  fi
  let "x++"
done

【讨论】:

  • 这是一个无限循环?你没有让 x 更高,所以它不会达到 $lengthOfAnswer
【解决方案2】:

尝试使用sed,解决很多问题。请参阅下一个代码作为起点。

secret="a b c d e f"
guess="a"

echo "${secret}" | sed 's/[^'${guess}' ]/_/g'

# add each new guess to the quess string. Assume after trying "a", first "p" and "q" is tried before "b" is tried
guess="apqb"
echo "${secret}" | sed 's/[^'${guess}' ]/_/g'

您需要做的就是从播放器读取输入并检查有效输入(一个字符,而不是空格、下划线或类似的东西)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2013-01-23
  • 2012-11-11
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多