📄 colorizing.html
字号:
52 trap 'echo -en "\E[?25h"; echo -en "\E[0m"; stty echo;\ 53 tput cup 20 0; rm -fr $HORSE_RACE_TMP_DIR' TERM EXIT 54 # See the chapter on debugging for an explanation of 'trap.' 55 56 # Set a unique (paranoid) name for the temp directory the script needs. 57 HORSE_RACE_TMP_DIR=$HOME/.horserace-`date +%s`-`head -c10 /dev/urandom | md5sum | head -c30` 58 59 # Create the temp directory and move right in. 60 mkdir $HORSE_RACE_TMP_DIR 61 cd $HORSE_RACE_TMP_DIR 62 63 64 # This function moves the cursor to line $1 column $2 and then prints $3. 65 # E.g.: "move_and_echo 5 10 linux" is equivalent to 66 #+ "tput cup 4 9; echo linux", but with one command instead of two. 67 # Note: "tput cup" defines 0 0 the upper left angle of the terminal, 68 #+ echo defines 1 1 the upper left angle of the terminal. 69 move_and_echo() { 70 echo -ne "\E[${1};${2}H""$3" 71 } 72 73 # Function to generate a pseudo-random number between 1 and 9. 74 random_1_9 () { 75 head -c10 /dev/urandom | md5sum | tr -d [a-z] | tr -d 0 | cut -c1 76 } 77 78 # Two functions that simulate "movement," when drawing the horses. 79 draw_horse_one() { 80 echo -n " "//$MOVE_HORSE// 81 } 82 draw_horse_two(){ 83 echo -n " "\\\\$MOVE_HORSE\\\\ 84 } 85 86 87 # Define current terminal dimension. 88 N_COLS=`tput cols` 89 N_LINES=`tput lines` 90 91 # Need at least a 20-LINES X 80-COLUMNS terminal. Check it. 92 if [ $N_COLS -lt 80 ] || [ $N_LINES -lt 20 ]; then 93 echo "`basename $0` needs a 80-cols X 20-lines terminal." 94 echo "Your terminal is ${N_COLS}-cols X ${N_LINES}-lines." 95 exit $E_RUNERR 96 fi 97 98 99 # Start drawing the race field. 100 101 # Need a string of 80 chars. See below. 102 BLANK80=`seq -s "" 100 | head -c80` 103 104 clear 105 106 # Set foreground and background colors to white. 107 echo -ne '\E[37;47m' 108 109 # Move the cursor on the upper left angle of the terminal. 110 tput cup 0 0 111 112 # Draw six white lines. 113 for n in `seq 5`; do 114 echo $BLANK80 # Use the 80 chars string to colorize the terminal. 115 done 116 117 # Sets foreground color to black. 118 echo -ne '\E[30m' 119 120 move_and_echo 3 1 "START 1" 121 move_and_echo 3 75 FINISH 122 move_and_echo 1 5 "|" 123 move_and_echo 1 80 "|" 124 move_and_echo 2 5 "|" 125 move_and_echo 2 80 "|" 126 move_and_echo 4 5 "| 2" 127 move_and_echo 4 80 "|" 128 move_and_echo 5 5 "V 3" 129 move_and_echo 5 80 "V" 130 131 # Set foreground color to red. 132 echo -ne '\E[31m' 133 134 # Some ASCII art. 135 move_and_echo 1 8 "..@@@..@@@@@...@@@@@.@...@..@@@@..." 136 move_and_echo 2 8 ".@...@...@.......@...@...@.@......." 137 move_and_echo 3 8 ".@@@@@...@.......@...@@@@@.@@@@...." 138 move_and_echo 4 8 ".@...@...@.......@...@...@.@......." 139 move_and_echo 5 8 ".@...@...@.......@...@...@..@@@@..." 140 move_and_echo 1 43 "@@@@...@@@...@@@@..@@@@..@@@@." 141 move_and_echo 2 43 "@...@.@...@.@.....@.....@....." 142 move_and_echo 3 43 "@@@@..@@@@@.@.....@@@@...@@@.." 143 move_and_echo 4 43 "@..@..@...@.@.....@.........@." 144 move_and_echo 5 43 "@...@.@...@..@@@@..@@@@.@@@@.." 145 146 147 # Set foreground and background colors to green. 148 echo -ne '\E[32;42m' 149 150 # Draw eleven green lines. 151 tput cup 5 0 152 for n in `seq 11`; do 153 echo $BLANK80 154 done 155 156 # Set foreground color to black. 157 echo -ne '\E[30m' 158 tput cup 5 0 159 160 # Draw the fences. 161 echo "++++++++++++++++++++++++++++++++++++++\ 162 ++++++++++++++++++++++++++++++++++++++++++" 163 164 tput cup 15 0 165 echo "++++++++++++++++++++++++++++++++++++++\ 166 ++++++++++++++++++++++++++++++++++++++++++" 167 168 # Set foreground and background colors to white. 169 echo -ne '\E[37;47m' 170 171 # Draw three white lines. 172 for n in `seq 3`; do 173 echo $BLANK80 174 done 175 176 # Set foreground color to black. 177 echo -ne '\E[30m' 178 179 # Create 9 files to stores handicaps. 180 for n in `seq 10 7 68`; do 181 touch $n 182 done 183 184 # Set the first type of "horse" the script will draw. 185 HORSE_TYPE=2 186 187 # Create position-file and odds-file for every "horse". 188 #+ In these files, store the current position of the horse, 189 #+ the type and the odds. 190 for HN in `seq 9`; do 191 touch horse_${HN}_position 192 touch odds_${HN} 193 echo \-1 > horse_${HN}_position 194 echo $HORSE_TYPE >> horse_${HN}_position 195 # Define a random handicap for horse. 196 HANDICAP=`random_1_9` 197 # Check if the random_1_9 function returned a good value. 198 while ! echo $HANDICAP | grep [1-9] &> /dev/null; do 199 HANDICAP=`random_1_9` 200 done 201 # Define last handicap position for horse. 202 LHP=`expr $HANDICAP \* 7 + 3` 203 for FILE in `seq 10 7 $LHP`; do 204 echo $HN >> $FILE 205 done 206 207 # Calculate odds. 208 case $HANDICAP in 209 1) ODDS=`echo $HANDICAP \* 0.25 + 1.25 | bc` 210 echo $ODDS > odds_${HN} 211 ;; 212 2 | 3) ODDS=`echo $HANDICAP \* 0.40 + 1.25 | bc` 213 echo $ODDS > odds_${HN} 214 ;; 215 4 | 5 | 6) ODDS=`echo $HANDICAP \* 0.55 + 1.25 | bc` 216 echo $ODDS > odds_${HN} 217 ;; 218 7 | 8) ODDS=`echo $HANDICAP \* 0.75 + 1.25 | bc` 219 echo $ODDS > odds_${HN} 220 ;; 221 9) ODDS=`echo $HANDICAP \* 0.90 + 1.25 | bc` 222 echo $ODDS > odds_${HN} 223 esac 224 225 226 done 227 228 229 # Print odds. 230 print_odds() { 231 tput cup 6 0 232 echo -ne '\E[30;42m' 233 for HN in `seq 9`; do 234 echo "#$HN odds->" `cat odds_${HN}` 235 done 236 } 237 238 # Draw the horses at starting line. 239 draw_horses() { 240 tput cup 6 0 241 echo -ne '\E[30;42m' 242 for HN in `seq 9`; do 243 echo /\\$HN/\\" " 244 done 245 } 246 247 print_odds 248 249 echo -ne '\E[47m' 250 # Wait for a enter key press to start the race. 251 # The escape sequence '\E[?25l' disables the cursor. 252 tput cup 17 0 253 echo -e '\E[?25l'Press [enter] key to start the race... 254 read -s 255 256 # Disable normal echoing in the terminal. 257 # This avoids key presses that might "contaminate" the screen 258 #+ during the race. 259 stty -echo 260 261 # -------------------------------------------------------- 262 # Start the race. 263 264 draw_horses 265 echo -ne '\E[37;47m' 266 move_and_echo 18 1 $BLANK80 267 echo -ne '\E[30m' 268 move_and_echo 18 1 Starting... 269 sleep 1 270 271 # Set the column of the finish line. 272 WINNING_POS=74 273 274 # Define the time the race started. 275 START_TIME=`date +%s` 276 277 # COL variable needed by following "while" construct. 278 COL=0 279 280 while [ $COL -lt $WINNING_POS ]; do 281 282 MOVE_HORSE=0 283 284 # Check if the random_1_9 function has returned a good value. 285 while ! echo $MOVE_HORSE | grep [1-9] &> /dev/null; do 286 MOVE_HORSE=`random_1_9` 287 done 288 289 # Define old type and position of the "randomized horse". 290 HORSE_TYPE=`cat horse_${MOVE_HORSE}_position | tail -1` 291 COL=$(expr `cat horse_${MOVE_HORSE}_position | head -1`) 292 293 ADD_POS=1 294 # Check if the current position is an handicap position. 295 if seq 10 7 68 | grep -w $COL &> /dev/null; then 296 if grep -w $MOVE_HORSE $COL &> /dev/null; then 297 ADD_POS=0 298 grep -v -w $MOVE_HORSE $COL > ${COL}_new 299 rm -f $COL 300 mv -f ${COL}_new $COL 301 else ADD_POS=1 302 fi 303 else ADD_POS=1 304 fi 305 COL=`expr $COL + $ADD_POS` 306 echo $COL > horse_${MOVE_HORSE}_position # Store new position. 307 308 # Choose the type of horse to draw. 309 case $HORSE_TYPE in 310 1) HORSE_TYPE=2; DRAW_HORSE=draw_horse_two 311 ;; 312 2) HORSE_TYPE=1; DRAW_HORSE=draw_horse_one 313 esac 314 echo $HORSE_TYPE >> horse_${MOVE_HORSE}_position # Store current type. 315 316 # Set foreground color to black and background to green. 317 echo -ne '\E[30;42m' 318 319 # Move the cursor to new horse position. 320 tput cup `expr $MOVE_HORSE + 5` `cat horse_${MOVE_HORSE}_position | head -1` 321 322 # Draw the horse. 323 $DRAW_HORSE 324 usleep $USLEEP_ARG 325 326 # When all horses have gone beyond field line 15, reprint odds. 327 touch fieldline15 328 if [ $COL = 15 ]; then 329 echo $MOVE_HORSE >> fieldline15 330 fi 331 if [ `wc -l fieldline15 | cut -f1 -d " "` = 9 ]; then 332 print_odds 333 : > fieldline15 334 fi 335 336 # Define the leading horse. 337 HIGHEST_POS=`cat *position | sort -n | tail -1` 338 339 # Set background color to white. 340 echo -ne '\E[47m' 341 tput cup 17 0 342 echo -n Current leader: `grep -w $HIGHEST_POS *position | cut -c7`" " 343 344 done 345 346 # Define the time the race finished. 347 FINISH_TIME=`date +%s` 348 349 # Set background color to green and enable blinking text. 350 echo -ne '\E[30;42m' 351 echo -en '\E[5m' 352 353 # Make the winning horse blink. 354 tput cup `expr $MOVE_HORSE + 5` `cat horse_${MOVE_HORSE}_position | head -1` 355 $DRAW_HORSE 356 357 # Disable blinking text. 358 echo -en '\E[25m' 359 360 # Set foreground and background color to white. 361 echo -ne '\E[37;47m' 362 move_and_echo 18 1 $BLANK80 363 364 # Set foreground color to black. 365 echo -ne '\E[30m' 366 367 # Make winner blink. 368 tput cup 17 0 369 echo -e "\E[5mWINNER: $MOVE_HORSE\E[25m"" Odds: `cat odds_${MOVE_HORSE}`"\ 370 " Race time: `expr $FINISH_TIME - $START_TIME` secs" 371 372 # Restore cursor and old colors. 373 echo -en "\E[?25h" 374 echo -en "\E[0m" 375 376 # Restore echoing. 377 stty echo 378 379 # Remove race temp directory. 380 rm -rf $HORSE_RACE_TMP_DIR 381 382 tput cup 19 0 383 384 exit 0</PRE></TD></TR></TABLE><HR></DIV><P>See also <AHREF="contributed-scripts.html#HASHEXAMPLE">Example A-22</A>.</P><DIVCLASS="CAUTION"><TABLECLASS="CAUTION"WIDTH="100%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="common/caution.png"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>There is, however, a major problem with all this. <ICLASS="EMPHASIS">ANSI escape sequences are emphatically non-portable.</I> What works fine on some terminal emulators (or the console) may work differently, or not at all, on others. A <SPANCLASS="QUOTE">"colorized"</SPAN> script that looks stunning on the script author's machine may produce unreadable output on someone else's. This greatly compromises the usefulness of <SPANCLASS="QUOTE">"colorizing"</SPAN> scripts, and possibly relegates this technique to the status of a gimmick or even a <SPANCLASS="QUOTE">"toy"</SPAN>.</P></TD></TR></TABLE></DIV><P>Moshe Jacobson's <BCLASS="COMMAND">color</B> utility (<AHREF="http://runslinux.net/projects.html#color"TARGET="_top">http://runslinux.net/projects.html#color</A>) considerably simplifies using ANSI escape sequences. It substitutes a clean and logical syntax for the clumsy constructs just discussed.</P><P>Henry/teikedvl has likewise created a utility (<AHREF="http://scriptechocolor.sourceforge.net/"TARGET="_top">http://scriptechocolor.sourceforge.net/</A>) to simplify creation of colorized scripts.</P></DIV><H3CLASS="FOOTNOTES">Notes</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN15428"HREF="colorizing.html#AEN15428">[1]</A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P><SPANCLASS="ACRONYM">ANSI</SPAN> is, of course, the acronym for the American National Standards Institute. This august body establishes and maintains various technical and industrial standards.</P></TD></TR></TABLE><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLEWIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="recursionsct.html">Prev</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="optimizations.html">Next</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">Recursion</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="miscellany.html">Up</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">Optimizations</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -