- 論壇徽章:
- 0
|
人氣少了,拿個以前的練習(xí)灌灌水吧。
還是用中文解析一下,免班竹說我 show script 沒註解..
也可多灌一篇水..hehehe
# 程序名 bash 寫法,等如 PROG=`basename $0`
PROG=${0##*/}
# 將 bash 的內(nèi)建命令作為猜字的源,以數(shù)組形式放入變量 $KEYWORD
KEYWORD=(alias bind builtin cd compgen continue dirs echo eval
exit false fg for getopts help if kill local popd pushd
read return set shopt suspend time trap type ulimit unalias
until wait bg break case command complete
declare disown enable exec export fc for function hash history
jobs let logout printf pwd readonly select shift source test
times true typeset umask unset variables while \: \(\( \[\[ \[)
# 這個變量 $WORD 是由 ${KEYWORD[@]} 隨機生成,
# 分開來看, [(( $RANDOM%${#KEYWORD[@] ))] ,這個
# $RANDOM 會隨機生成一個數(shù)字 0-32768(?) % 是取寞 ,
# ${#KEYWORD[@]} 反回 KEYWORD 數(shù)組字串的個數(shù)總數(shù),
# 如是成為 $KEYWORD 下標(biāo) ,那可以是 WORD=${KEYWORD[0]}
# 也可是 WORD=${KEYWORD[20]} , 是由RANDOM 去選的,
# 不會大過 KEYWORD 字符的總數(shù)
WORD=${KEYWORD[$(($RANDOM%${#KEYWORD[@]}))]}
# 這個隨機生成的字符長度
LENGTH="${#WORD}"
# 再將 $WORD 變成一個數(shù)組,用sed 將字母以空格分開
# 執(zhí)行的結(jié)果以 SPLIT_WORD=( )方法成為數(shù)組
SPLIT_WORD=($(echo $WORD | sed 's/./& /g'))
# 只是以 - 代替那些字母
GUESS=$(echo $WORD | sed 's/./-/g')
# 函數(shù)一個,用來取得輸入
# read -n 1 設(shè)定輸入只讀一個鍵,請看 Bash Manual
function MyGuess {
echo -n 'Guess the command: ' >&2
read -n 1
}
# function, displays information
# 沒什麼,函數(shù)一個
function ShowInfo {
echo "The builtin command contains $LENGTH letters"
echo 'Guess the letter one by one.'
echo "$GUESS"
}
# here document,用來搞搞打招呼 
cat<<!
#######################################################
$(echo "Hello $(whoami)" , welcome to $(echo $PROG)
It is a little game to guess BASH builtin command
Here we go.
#######################################################
!
ShowInfo
# main loop
for ((i=0 ; i<$LENGTH ; ++i))
do
MyGuess
# 測試你的輸入是否和SPLIT_WORD 的每個字相同,相同就打印
# Right (綠色) ,不同打印該字母(紅色)
if [ "$REPLY" != "${SPLIT_WORD[$i]}" ] ; then
echo
echo -e "The letter is \033[31m${SPLIT_WORD[$i]}\033[39m"
else
echo
echo -e "\033[32mRight.\033[39m"
fi
# ANSWER 是空的, 但每一字母由 ${SPLIT_WORD[$i]}
# 會傳回 ANSWER , 我要把猜過了的字母打印,沒猜的還是以
# - 顯示 ,那個 $GUESS (($i + 1)) 會隨 主 loop增加 1
# 等于 ${GUESS:0} ${GUESS:1} ,${GUESS:n}, 這個是 bash 的 #${var ffset}
ANSWER="$ANSWER${SPLIT_WORD[$i]}"
DISPLAY="${ANSWER}${GUESS (($i + 1))}"
# 顯示以 s---- sl--- sle-- 的方式
echo "$DISPLAY"
done
echo 'Thankyou for playing.'
echo ""
# Display usage
help $(echo $WORD)
手也累了,各位大大,小弟文筆差,有錯見諒 |
|