2016-09-04 8 views
0

나는 임의의 문자열을 만들고, 그 문자열을 분해하고, 표시된 문자와 일치하는 입력을 감시하는 약간의 타이핑 게임을 진행 해왔다. 내가 여기에서받은 모든 도움 덕분에 나는 sooo 가까이에 있습니다 ...하지만. 나는 완전히 엉망이다. 내 질문 : 도보 "^"각 문자에서 같은 그Walking caret BASH

3 x P ! 0 D 3 D 5 T r ! n G 
^ 

난에 대해 확인할 수있는 VAR에 첫 세트 인을 구현하는 가장 좋은 방법은, 다음 올바른 입력

3 x P ! 0 D 3 D 5 T r ! n G 
^

I로 이동 여기에 코드를 붙여 넣으 려하지 마세요. 내 github을 체크 아웃 하시려면 https://github.com/archae0pteryx/chuppy 을 참조하십시오. 감사!

+3

(http://linux.die.net/man/1/tput)을 사용하면 선을 지우고 화면의 다양한 지점으로 이동할 수 있습니다. [terminfo (5)] (http://linux.die.net/man/5/terminfo)에는 다양한 명령에 대한 정보가 있습니다. – Actorclavilis

+0

와우. tput는 굉장해 보인다! 감사. 나는 정말로 그 하나의 주위에 나의 머리를 감쌀 필요가있을 것이다. =) 나는 당황하기 전에 두 칸을 추가하는 것과 같은 무언가를 생각하고 있었다. 나는 계속해서 읽어야한다. 다시 한 번 감사드립니다. – archae0pteryx

답변

1

여기 당신이 그것에서 뭔가를 배울 수 있기를 바랍니다이

#!/bin/bash 

len=14 
pos=0 
str="$(tr -Cd 'A-Za-z0-9' < /dev/urandom | head -c "$len" | sed -e 's/./& /g')" 

show_caret() { 
    tput el1 
    head -c $((2*pos)) /dev/zero | tr '\0' ' ' 
    echo '^' 
} 

echo "${str}" 
show_caret 

while (($pos < $len)); do 
    read -rsN1 ch 
    if [[ $ch == "${str:$((2*pos)):1}" ]]; then 
     ((pos++)) 
     tput cuu1 
     show_caret 
    fi 
done 

을 내 빠른 시도합니다.

+0

다시 @redneb 당신은 beez 무릎입니다! 고맙습니다. – archae0pteryx

0

순 접근은 printf과 결합 된 read -n1을 사용하는 것입니다. \r 라인의 시작 부분으로 커서를 이동하고, read -n1 입력으로 한 문자를 읽습니다 :

$ cat walk.bash 
#!/bin/bash 

echo "3 x P ! 0 D 3 D 5 T r ! n G" 
i=1 
answer="" 
while [ "${#answer}" -lt 14 ]; do 
    printf "\r%$((i * 2 - 1))s" "^" 
    read -rn1 -s ans 
    answer+="$ans" 
    ((i++)) 
done 
printf '\n' 
echo "$answer" 
$ ./walk.bash 
3 x P ! 0 D 3 D 5 T r ! n G 
^ 
당신은 [tput을]로 볼 수