我目前正在用 bash 编写一个游戏,它将用户输入与计算机输入进行比较。
我想在比较两个字符串后找到剩余的字符。以下是我的想法:
user_word='hello'
computer_word='bxolq'
compare ${user_word} ${computer_word}
compare function: (finds "l" to be equal in the two strings)
calculate leftover word for user (= "heo")
calculate leftover word for computer (= "bxoq")
现在计算机获胜,因为"bxoq"
长度为 4,用户剩余数"heo"
为 3。
我试图diff
解决这个问题,但是输出
diff <(echo ${user_word} | sed 's:\(.\):\1\n:g' | sort) <(echo ${computer_word} | sed 's:\(.\):\1\n:g' | sort)
让我困惑。
所以我的问题是:我怎样才能完成剩余的比较?
答案1
在bash
shell 中,您可以使用 删除字符串中的一组字符中出现的所有字符${variable//[set]/}
,其中variable
保存我们要从中删除字符的字符串,其中[set]
是我们要删除的特定字符集。该集合是一个普通的 shell 模式括号表达式,例如[abcd]
or[a-g0-5]
或类似的,它将匹配一组字符中的一个字符。
替换bash
将匹配集合中的所有字符,并将它们替换为空(即删除它们)。
您可以在代码中使用它来从另一个字符串中删除一个字符串中存在的所有字符,反之亦然:
$ user_word='hello' comp_word='bxolq'
$ echo "${user_word//["$comp_word"]/}"
he
$ echo "${comp_word//["$user_word"]/}"
bxq
您将使用的下一个功能是扩展${#variable}
,它将为您提供存储在变量中的字符串中的字符数variable
:
$ short_user_word=${user_word//["$comp_word"]/}; suw_len=${#short_user_word}
$ short_comp_word=${comp_word//["$user_word"]/}; scw_len=${#short_comp_word}
$ if [ "$scw_len" -lt "$suw_len" ]; then echo 'User won'; elif [ "$scw_len" -gt "$suw_len" ]; then echo 'Computer won'; else echo 'It is a draw'; fi
Computer won
作为从其参数中获取两个单词的脚本:
#!/bin/bash
user_word=$1
comp_word=$2
short_user_word=${user_word//["$comp_word"]/}; suw_len=${#short_user_word}
short_comp_word=${comp_word//["$user_word"]/}; scw_len=${#short_comp_word}
if [ "$scw_len" -lt "$suw_len" ]; then
echo 'User won'
elif [ "$scw_len" -gt "$suw_len" ]; then
echo 'Computer won'
else
echo 'It is a draw'
fi