首页 > 学技术 > 技术网文 > Linux Shell > 正文

[原创] 人氣少了,拿個以前的練習灌灌水吧。


来源 chinaunix.net 酷勤网整理

以前寫的,用來加強對 bash builtin 的記憶..hehehe
灌水相當合用 :)
#! /bin/bash
# A little game to guess bash builtin command
# written by no_spam_twf_cc@yahoo.com.hk
# $date: Jul 20,2004 $PROG: guess.sh   $LICINCE: PUBLIC DOMAIN

# Program name
PROG=${0##*/}

# array, contains command name of bash builtin
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 \: \(\( \[\[ \[)

# Get a random word to guess
WORD=${KEYWORD[$(($RANDOM%${#KEYWORD[@]}))]}

# Length of the word
LENGTH="${#WORD}"

# Split the word , array
SPLIT_WORD=($(echo $WORD | sed 's/./& /g'))

# replace the word by -
GUESS=$(echo $WORD | sed 's/./-/g')

# function to get user input
function MyGuess {
echo -n 'Guess the command: ' >&2
read -n 1
}

# function, displays information
function ShowInfo {
echo "The builtin command contains $LENGTH letters"
echo 'Guess the letter one by one.'
echo "$GUESS"
}
# header
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
     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="$ANSWER${SPLIT_WORD[$i]}"
           DISPLAY="${ANSWER}${GUESS:$(($i + 1))}"
           echo "$DISPLAY"

done
echo 'Thankyou for playing.'
echo ""
# Display usage
help $(echo $WORD)

重看自己的「作品」,真是進步不大 ...:(



 網中人 回复于:2005-09-19 15:13:14

寫得不錯啊! 加油!

只是, 以 shell 版的宗旨來說, 不在乎人氣啊....


 twf_cc 回复于:2005-09-19 15:19:25

:)  :)  謝謝


 twf_cc 回复于:2005-09-19 16:21:18

還是用中文解析一下,免班竹說我 show script 沒註解..:)
也可多灌一篇水..hehehe
# 程序名 bash 寫法,等如 PROG=`basename $0`
PROG=${0##*/} 

# 將 bash 的內建命令作為猜字的源,以數組形式放入變量 $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 會隨機生成一個數字 0-32768(?) % 是取寞 ,
# ${#KEYWORD[@]} 反回 KEYWORD 數組字串的個數總數,
# 如是成為 $KEYWORD 下標 ,那可以是 WORD=${KEYWORD[0]}
# 也可是 WORD=${KEYWORD[20]} , 是由RANDOM 去選的,
# 不會大過 KEYWORD 字符的總數

WORD=${KEYWORD[$(($RANDOM%${#KEYWORD[@]}))]}

# 這個隨機生成的字符長度
LENGTH="${#WORD}"

# 再將 $WORD 變成一個數組,用sed 將字母以空格分開
# 執行的結果以 SPLIT_WORD=( )方法成為數組
SPLIT_WORD=($(echo $WORD | sed 's/./& /g'))

# 只是以 - 代替那些字母
GUESS=$(echo $WORD | sed 's/./-/g')

# 函數一個,用來取得輸入
# read -n 1 設定輸入只讀一個鍵,請看 Bash Manual
function MyGuess {
echo -n 'Guess the command: ' >&2
read -n 1
}

# function, displays information
# 沒什麼,函數一個
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:offset}
 
          
           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)

手也累了,各位大大,小弟文筆差,有錯見諒


 waker 回复于:2005-09-19 16:24:33

支持原创:mrgreen:


 waker 回复于:2005-09-19 16:27:56

既然是bash
GUESS=$(echo $WORD | sed 's/./-/g') 何不直接用bash?
GUESS=${$WORD//?/-}


 twf_cc 回复于:2005-09-19 16:31:31

哈哈,那時沒想到,你改得好,!! 班竹高人!! :) 謝謝


 waker 回复于:2005-09-19 16:34:25

GUESS=${WORD//?/-}
写错了:mrgreen:


 twf_cc 回复于:2005-09-19 16:39:04

哈哈,我沒試,看來沒問題便趕快拍馬p , 哈哈哈 .....:)


 tonyfu 回复于:2005-09-19 18:05:26

看的我有点迷糊了,,

以我这水平看注释还不够详细,,哈哈哈哈


 twf_cc 回复于:2005-09-19 18:35:38

看的迷糊是我文筆差,先 Sorry 一下...


 uxfn123 回复于:2005-09-21 15:40:17

请教下,你的运行结果是什么?


 danielhf 回复于:2005-09-21 21:41:12

为何 PROG=${0##*/} 
何不 PROG=$(basename $0}

为何 $(echo "Hello $(whoami)")
何不 "Hello $(whoami)" (这样的多余 echo 还有好几处)

写得很好,我也学了不少~~ 谢谢了


 twf_cc 回复于:2005-09-21 23:01:23

basename 是外部程式,不及bash 內建變量擴展快,自用的script 
我一般會利用到該 shell 的特性,不考慮 portable 。
"Hello" 不是 command ,不會自動出現的 :)
最後那個 help $(echo $WORD) 可能多餘, help $WORD 應該
便成了,但我寫 shell script 一向以「三多」聞名,多 bug, 多餘,
多慢( code 沒寫好,執行要多慢有多慢) ,哈哈。
倒是班竹 waker 大大說為何不用 ${WORD//?/-} 代替 sed ,
那是對的,我那時會用這些擴展,但寫好試了數遍便放到一旁,
沒理會了,這些沒用的 script 寫的時候很好玩,寫完就沒興趣了...
我記得想了一兩天,在放假時寫了五六個小時...哈哈
我不是IT 人,寫 script 在我來說是一種游戲吧。


 Mc_Hill 回复于:2005-09-22 01:24:41

顶一下


 大大狗 回复于:2005-09-28 10:24:23

好东西,要支持


 公子月 回复于:2006-01-03 17:24:07

都看晕了


 shitou9000 回复于:2006-02-17 11:03:31

谢谢楼主~我看了很有长进。BASH不太熟。看不懂可以自己做变量
echo 就好了




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=613968
转载请注明作者名及原文出处



收藏本页到: