저는 현재 사용자 입력과 컴퓨터 입력을 비교하는 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이고 사용자의 남은 개수가 3이므로 컴퓨터가 승리합니다 "heo"
.
이 문제를 해결 하려고 노력했지만 diff
결과는
diff <(echo ${user_word} | sed 's:\(.\):\1\n:g' | sort) <(echo ${computer_word} | sed 's:\(.\):\1\n:g' | sort)
나를 혼란스럽게 한다.
그래서 내 질문은: 나머지 비교를 어떻게 완료할 수 있습니까?
답변1
셸 에서는 문자를 제거하려는 문자열이 어디에 있고 제거하려는 특정 문자 집합이 어디에 있는지를 bash
사용하여 문자열의 문자 집합 내에서 발생하는 모든 문자를 제거할 수 있습니다 . 세트는 문자 세트의 한 문자와 일치 하는 또는 유사한 일반 쉘 패턴 대괄호 표현식입니다.${variable//[set]/}
variable
[set]
[abcd]
[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